SeleniumWire快速爬取數(shù)據(jù)
一、安裝所需的庫
在終端使用pip進行安裝 pip install xxx
import tkinter
from seleniumwire import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
二、設置瀏覽器啟動選項
這里我使用的是Chrome,其中列舉了幾個常用的option,供大家學習使用
- option = webdriver.ChromeOptions():設置Chrome啟動選項
- option.add_argument(‘headless’):不打開瀏覽器進行數(shù)據(jù)爬取,因為沒有可視化過程,所以推薦整個流程開發(fā)完畢后,在使用此條代碼。
- option.add_experimental_option(“prefs”, {“profile.managed_default_content_settings.images”: 2}):如果網(wǎng)頁中的圖片對你沒有太大作用,可以不加載網(wǎng)頁圖片,以提高爬取速度。
- option.add_experimental_option(“detach”, True):防止程序執(zhí)行完瀏覽器自動關閉
- 配置瀏覽器路徑和驅動路徑(若使用已安裝的瀏覽器,則不需要配置,需要手動安裝chromedriver)
option.binary_location = r’./chrome-win64/chrome.exe’
driver_path = r"./chromedriver-win64/chromedriver.exe" - driver = webdriver.Chrome(service=Service(driver_path), options=option):加載以上配置,若第5步未配置,則使用driver = webdriver.Chrome(options=option)即可
- driver.maximize_window():最大化瀏覽器
- driver.implicitly_wait(60):設置隱式等待時長為60s,以后在更新Selenium的三種等待方式
option = webdriver.ChromeOptions()
option.add_argument('headless') # 不使用瀏覽器ui
option.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 不加載網(wǎng)頁圖片
option.add_experimental_option("detach", True) #
option.binary_location = r'./chrome-win64/chrome.exe'
driver_path = r"./chromedriver-win64/chromedriver.exe"
driver = webdriver.Chrome(service=Service(driver_path), options=option)
driver.maximize_window()
driver.implicitly_wait(60)
三、使用賬號密碼登錄網(wǎng)址
如果爬取的網(wǎng)站需要登陸,可使用selenium.find_element進行登錄
# 登錄
driver.get("your url") # 登錄的url
driver.find_element(by=By.ID, value='mobile').send_keys('your username')
driver.find_element(by=By.ID, value='passwd').send_keys('your password')
driver.find_element(by=By.ID, value='submitButton').click()
# 這里是你登錄之后的操作
'''your code '''
四、seleniumwire.requests爬取數(shù)據(jù)
- for request in driver.requests為固定寫法,其含義為:獲取Network中的所有請求的url,然后進行遍歷
2.if request.method == ‘POST’ and request.url == ‘your url’:當遍歷的請求滿足你設置的條件,例如為POST請求和指定的url,執(zhí)行response。
這里的url是你需要爬取的網(wǎng)址,在所有的請求中,你需要查看哪個請求是你需要的
3.data = request.response.body:通過request返回response請求的body
4.html一般會將網(wǎng)頁的數(shù)據(jù)進行壓縮以節(jié)省空間,如果為Gzip壓縮方式,可用以下固定的方式解壓縮,最終的htmls為字符串形式。
5.driver.requests.clear():將每次的請求關閉,以釋放資源。文章來源:http://www.zghlxwxcb.cn/news/detail-832093.html
# 使用seleniumwire.requests爬取數(shù)據(jù)
for request in driver.requests:
if request.method == 'POST' and request.url == 'your url':
data = request.response.body
buff = BytesIO(data)
f = gzip.GzipFile(fileobj=buff)
htmls = f.read().decode('utf-8')
print('response data: ', htmls)
driver.requests.clear()
五、數(shù)據(jù)清洗和保存
返回的response是頁面中的所有數(shù)據(jù),數(shù)據(jù)清洗可使用正則表達式,也可使用beautifulsoup,這兩種方法之后在進行匯總文章來源地址http://www.zghlxwxcb.cn/news/detail-832093.html
# 正則表達式清洗數(shù)據(jù)
data_code = re.findall(r'data_code\D+(\d+)', htmls)
pay_time = re.findall('"pay_time":"(.*?)"', htmls)
vehicle_id = re.findall('"vehicle_id":"(.*?)"', htmls)
pay_type = re.findall(r'pay_type\D+(\d+)', htmls)
# pandas保存數(shù)據(jù)到Excel中
data = {'數(shù)據(jù)編號': data_code, '時間': pay_time, '標識': vehicle_id, '類型': pay_type}
df = pd.DataFrame(data)
df.index += 1
df.to_excel('data.xlsx')
代碼匯總
import tkinter
from seleniumwire import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
# 配置chrome
option = webdriver.ChromeOptions()
option.add_argument('headless')
option.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
option.add_experimental_option("detach", True)
option.binary_location = r'./chrome-win64/chrome.exe'
driver_path = r"./chromedriver-win64/chromedriver.exe"
driver = webdriver.Chrome(service=Service(driver_path), options=option)
driver.maximize_window()
driver.implicitly_wait(60)
# 登錄
driver.get("your url") # 登錄界面的url
driver.find_element(by=By.ID, value='mobile').send_keys('your username')
driver.find_element(by=By.ID, value='passwd').send_keys('your password')
driver.find_element(by=By.ID, value='submitButton').click()
# 這里是你登錄之后的操作,可使用find_element轉到需要爬取的數(shù)據(jù)界面
'''your code '''
# 使用seleniumwire.requests爬取數(shù)據(jù)
for request in driver.requests:
if request.method == 'POST' and request.url == 'your url':
data = request.response.body
buff = BytesIO(data)
f = gzip.GzipFile(fileobj=buff)
htmls = f.read().decode('utf-8')
print('response data: ', htmls)
driver.requests.clear()
# 使用正則表達式對數(shù)據(jù)進行清洗
data_code = re.findall(r'data_code\D+(\d+)', htmls)
pay_time = re.findall('"pay_time":"(.*?)"', htmls)
vehicle_id = re.findall('"vehicle_id":"(.*?)"', htmls)
pay_type = re.findall(r'pay_type\D+(\d+)', htmls)
# 將采集的數(shù)據(jù)保存到Excel中
data = {'數(shù)據(jù)編號': data_code, '時間': pay_time, '標識': vehicle_id, '類型': pay_type}
df = pd.DataFrame(data)
df.index += 1
df.to_excel('data.xlsx')
tkinter.messagebox.showinfo(title='提示', message='已采取完畢')
到了這里,關于【Python網(wǎng)絡爬蟲】三分鐘教會你使用SeleniumWire快速爬取數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!