方式
優點缺點
分析介面
直接可以請求到資料,不需要做任何解析工作,**量少,效能高
分析介面比較複雜,特別是一些通過js混淆的介面,容易被發現是爬蟲
selenium
直接模擬瀏覽器的行為,瀏覽器可以請求到的,使用 selenium 也能請求到,比較穩定
**量多,效能低
selenium相當於是乙個機械人,可以模擬人在瀏覽器上的一些行為,自動處理瀏覽器上的一些行為,比如點選,填充資料,刪除cookie等
chromedriver是乙個驅動chrome瀏覽器的驅動程式,使用他才可以驅動瀏覽器,針對不同的瀏覽器有不同的driver
from selenium import webdriver
# chromedriver的絕對路徑
driver_path = r'd:\program files\chromedriver\chromedriver.exe'
# 初始化乙個driver,並且指定chromedriver的路徑
driver = webdriver.chrome(executable_path=driver_path)
# 請求網頁
driver.get('')
# 通過page_source獲取網頁源**
print(driver.page_source)
官方文件:
關閉頁面
定位元素
submittag = driver.find_element_by_id('su')
submittag1 = driver.find_element(by.id,'su')
submittag = driver.find_element_by_class_name('su')
submittag1 = driver.find_element(by.class_name,'su')
submittag = driver.find_element_by_name('email')
submittag1 = driver.find_element(by.name,'email')
submittag = driver.find_element_by_tag_name('div')
submittag1 = driver.find_element(by.tag_name,'div')
submittag = driver.find_element_by_xpath('//div')
submittag1 = driver.find_element(by.xpath,'//div')
submittag = driver.find_element_by_css_selector('//div')
submittag1 = driver.find_element(by.css_selector,'//div')
操作表單元素inputtag = driver.find_element_by_id('kw')
inputtag.send_keys('python')
使用clear
方法可以清除輸入框中的內容inputtag.clear()
remembertag = driver.find_element_by_name("rememberme")
remembertag.click()
from selenium.webdriver.support.ui import select
# 選中這個標籤,然後使用select建立物件
selecttag = select(driver.find_element_by_id("city-select"))
# 根據索引選擇
selecttag.select_by_index(1)
# 根據值選擇
selecttag.select_by_value("")
# 根據可視的文字選擇
selecttag.select_by_visible_text("上海")
# 取消選中所有選項
selecttag.deselect_all()
inputtag = driver.find_element_by_id('su')
inputtag.click()
行為鏈
有時候在頁面中的操作可能要有很多步,那麼這時候可以使用滑鼠行為鏈類actionchains來完成。比如現在要將滑鼠移動到某個元素上並執行點選事件
inputtag = driver.find_element_by_id('kw')
submittag = driver.find_element_by_id('su')
actions = actionchains(driver)
actions.move_to_element(inputtag)
actions.send_keys_to_element(inputtag,'python')
actions.move_to_element(submittag)
actions.click(submittag)
actions.perform()
cookie操作for cookie in driver.get_cookies():
print(cookie)
-根據cookie的key獲取value
value = driver.get_cookie(key)
driver.delete_all_cookies()
driver.delete_cookie(key)
頁面等待
現在的網頁越來越多採用了 ajax 技術,這樣程式便不能確定何時某個元素完全載入出來了。如果實際頁面等待時間過長導致某個dom元素還沒出來,但是你的**直接使用了這個webelement,那麼就會丟擲nullpointer的異常。為了解決這個問題。所以 selenium 提供了兩種等待方式:一種是隱式等待、一種是顯式等待。
driver = webdriver.chrome(executable_path=driver_path)
driver.implicitly_wait(10)
# 請求網頁
driver.get("")
from selenium import webdriver
from selenium.webdriver.support.ui import webdriverwait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import by
driver_path = r'd:\program files\chromedriver\chromedriver.exe'
driver = webdriver.chrome(executable_path=driver_path)
driver.get('')
driver.implicitly_wait(20)
element = webdriverwait(driver, 10).until(
ec.presence_of_element_located((by.name, 'phone'))
)print(element)
切換頁面
有時候視窗中有很多子tab頁面。這時候肯定是需要進行切換的。selenium提供了乙個叫做switch_to_window來進行切換,具體切換到哪個頁面,可以從driver.window_handles中找到。
# 開啟乙個新的頁面
self.driver.execute_script("window.open('"+url+"')")
# 切換到這個新的頁面中
self.driver.switch_to_window(self.driver.window_handles[1])
設定**ip
有時候頻繁爬取一些網頁。伺服器發現你是爬蟲後會封掉你的ip位址。這時候我們可以更改**ip。更改**ip,不同的瀏覽器有不同的實現方式。這裡以chrome瀏覽器為例
from selenium import webdriver
options = webdriver.chromeoptions()
options.add_argument("--proxy-server=")
driver_path = r"d:\program files\chromedriver\chromedriver.exe"
driver = webdriver.chrome(executable_path=driver_path,chrome_options=options)
driver.get('')
webelement元素
from selenium.webdriver.remote.webelement import webelement類是每個獲取出來的元素的所屬類,它有一些常用的屬性
動態網頁爬蟲
network 記錄的是從開啟瀏覽器的開發者工具到網頁載入完畢之間的所有請求。如果你在網頁載入完畢後開啟,裡面可能就是空的,我們開著開發者工具重新整理一下網頁即可 爬蟲中常用的請求型別有 all xhr img 和 media,剩下的了解一下即可 常用的請求資訊,比如請求的名稱 狀態碼 型別 資料大...
python動態爬蟲 Python動態網頁爬蟲技術
這一講,我將會為大家講解稍微複雜一點的爬蟲,即動態網頁的爬蟲。動態網頁技術介紹 動態網頁爬蟲技術一之api請求法 動態網頁爬蟲技術二之模擬瀏覽器法 google chrome driver安裝 課後作業 關於作者 動態網頁技術介紹 所謂的動態網頁,是指跟靜態網頁相對的一種網頁程式設計技術。靜態網頁,...
python3 動態網頁爬蟲
我們使用python3,主要用到re,requests模組。一般來說爬蟲的流程是這樣 先看網頁源 再找到要爬的字段出現的區域,用正規表示式找到這個字段,再列印或者匯出結果。coding utf 8 import re import urllib.request html response.read ...