為什么要使用模擬器?
在使用request的時候,大型網(wǎng)站都有很多的反爬機(jī)制,典型比如滑動驗證碼、彈窗廣告、彈窗驗證、登錄認(rèn)證、Ajax異步加載...等等,這些是request很難繞過去的。這時候可以使用selenium模擬器來模擬用戶操作:Selenium可以根據(jù)的指令,讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏,或者判斷網(wǎng)站上某些動作是否發(fā)生等.
目錄
1.安裝依賴(已經(jīng)安裝過的,請先卸載再安裝,確保是最新版本)
2.驗證版本
3.下載驅(qū)動(兩種方式二選一)
4.測試Selenium4:訪問百度并搜索
5.編寫中間件:打開middlewares.py文件,新建中間件SeleniumMiddleware
6.開啟中間件:打開settings.py
7.selenium反屏蔽
1.安裝依賴(已經(jīng)安裝過的,請先卸載再安裝,確保是最新版本)
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2.驗證版本
pip list
3.下載驅(qū)動(兩種方式二選一)
①?使用SergeyPirogov (Sergey Pirogov) · GitHub自動下載驅(qū)動管理器(推薦)
pip install webdriver-manager -i https://pypi.tuna.tsinghua.edu.cn/simple
②手動下載并指定驅(qū)動
selenium3.0環(huán)境搭建_蒼穹之躍的博客-CSDN博客_selenium3版本單獨創(chuàng)建一個目錄,如:D:/drivers/,把不同瀏覽器的驅(qū)動都放到該目錄。geckodriver.exe第一步:單獨創(chuàng)建一個目錄,如:D:/drivers/bin ,把不同瀏覽器的驅(qū)動都放到該目錄。geckodriver.exe(Firefox)、chromedriver.exe(Chrome)、MicrosoftWebDriver.exe(Edge)、IEDriverServer.exe(IE)、operadriver.exe(Opera)等。然后,將D:/drivers/bin添加到系統(tǒng)環(huán)境.https://blog.csdn.net/wenxingchen/article/details/118105591
4.測試Selenium4:訪問百度并搜索
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
if __name__ == '__main__':
# 初始化驅(qū)動
service = ChromeService(executable_path=ChromeDriverManager().install())
# 配置
options = webdriver.ChromeOptions()
# 實例化驅(qū)動
driver = webdriver.Chrome(service=service, options=options)
# 訪問百度
driver.get("https://www.baidu.com/")
# 獲取當(dāng)前頁面
html = driver.page_source
# 在頁面上執(zhí)行JS:基本上 API 沒有提供的所有功能都可以用執(zhí)行 JavaScript 的方式來實現(xiàn)
driver.execute_script('alert("彈個框試試")')
# 頁面停留
time.sleep(10)
# 銷毀實例
driver.quit()
5.編寫中間件:打開middlewares.py文件,新建中間件SeleniumMiddleware
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
class SeleniumMiddleware(object):
def process_response(self, request, response, spider):
# 初始化驅(qū)動
service = ChromeService(executable_path=ChromeDriverManager().install())
# 配置
options = webdriver.ChromeOptions()
# 無頭模式
# options.add_argument('--headless')
# 獲取瀏覽器實例
driver = webdriver.Chrome(service=service, options=options)
# 訪問網(wǎng)頁
driver.get(request.url)
# 全屏
# driver.maximize_window()
# 一般用于異步加載-等待特定元素出現(xiàn):driver就是瀏覽器驅(qū)動,timeout就是等待的時長,until后是判斷元素是否出現(xiàn)的
wdw = WebDriverWait(driver, timeout=10).until(lambda d: d.find_element(By.CLASS_NAME, "lm_tabe"))
# network記錄,這里可以獲得所有ajax請求的結(jié)果
# logs = get_xhr_logs(driver)
# 動態(tài)加載后的網(wǎng)頁
html = driver.page_source
# 退出瀏覽器
driver.quit()
return scrapy.http.HtmlResponse(url=request.url, body=html.encode('utf-8'), encoding='utf-8', request=request)
6.開啟中間件:打開settings.py
DOWNLOADER_MIDDLEWARES = {
'announcement.middlewares.SeleniumMiddleware': 543,
}
7.selenium反屏蔽
有些網(wǎng)站加了一層對selenium 的檢測來防止一些爬蟲?;径际菍indow.navigator.webdriver屬性的檢測,只要將此屬性置成undefined即可。但是driver.execute_script()方法是在頁面加載后執(zhí)行的。而反屏蔽檢測是在頁面渲染之前就執(zhí)行了。我們可以使用本地代理的方式來繞過(后面幾章會講到),但這里我們使用更簡便的方式:使用CDP(Chrome Devtools-Protocol,Chrome 開發(fā)工具協(xié)議)來解決。
典型的selenium反屏蔽網(wǎng)站:Scrape | Movie文章來源:http://www.zghlxwxcb.cn/news/detail-478486.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-478486.html
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
if __name__ == '__main__':
# 初始瀏覽器驅(qū)動
options = webdriver.ChromeOptions()
# 隱藏提示條
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 隱藏自動化擴(kuò)展信息
options.add_experimental_option('useAutomationExtension', False)
# 初始化驅(qū)動
service = ChromeService(executable_path=ChromeDriverManager().install())
# 瀏覽器實例化
driver = webdriver.Chrome(service=service, options=options)
# 隱藏window.navigator.webdriver
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
# 訪問
driver.get("https://antispider1.scrape.center/")
driver.execute_script('alert("彈個框試試")')
time.sleep(10)
# 退出驅(qū)動實例
driver.quit()
到了這里,關(guān)于Scrapy第十一(①)篇:selenium4模擬器中間件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!