为什么要使用模拟器?
在使用request的时候,大型网站都有很多的反爬机制,典型比如滑动验证码、弹窗广告、弹窗验证、登录认证、Ajax异步加载...等等,这些是request很难绕过去的。这时候可以使用selenium模拟器来模拟用户操作:Selenium可以根据的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生等.
目录
1.安装依赖(已经安装过的,请先卸载再安装,确保是最新版本)
2.验证版本
3.下载驱动(两种方式二选一)
4.测试Selenium4:访问百度并搜索
5.编写中间件:打开middlewares.py文件,新建中间件SeleniumMiddleware
6.开启中间件:打开settings.py
7.selenium反屏蔽
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
pip list
① 使用SergeyPirogov (Sergey Pirogov) · GitHub自动下载驱动管理器(推荐)
pip install webdriver-manager -i https://pypi.tuna.tsinghua.edu.cn/simple
②手动下载并指定驱动
selenium3.0环境搭建_苍穹之跃的博客-CSDN博客_selenium3版本单独创建一个目录,如:D:/drivers/,把不同浏览器的驱动都放到该目录。geckodriver.exe第一步:单独创建一个目录,如:D:/drivers/bin ,把不同浏览器的驱动都放到该目录。geckodriver.exe(Firefox)、chromedriver.exe(Chrome)、MicrosoftWebDriver.exe(Edge)、IEDriverServer.exe(IE)、operadriver.exe(Opera)等。然后,将D:/drivers/bin添加到系统环境.https://blog.csdn.net/wenxingchen/article/details/118105591
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__':
# 初始化驱动
service = ChromeService(executable_path=ChromeDriverManager().install())
# 配置
options = webdriver.ChromeOptions()
# 实例化驱动
driver = webdriver.Chrome(service=service, options=options)
# 访问百度
driver.get("https://www.baidu.com/")
# 获取当前页面
html = driver.page_source
# 在页面上执行JS:基本上 API 没有提供的所有功能都可以用执行 JavaScript 的方式来实现
driver.execute_script('alert("弹个框试试")')
# 页面停留
time.sleep(10)
# 销毁实例
driver.quit()
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):
# 初始化驱动
service = ChromeService(executable_path=ChromeDriverManager().install())
# 配置
options = webdriver.ChromeOptions()
# 无头模式
# options.add_argument('--headless')
# 获取浏览器实例
driver = webdriver.Chrome(service=service, options=options)
# 访问网页
driver.get(request.url)
# 全屏
# driver.maximize_window()
# 一般用于异步加载-等待特定元素出现:driver就是浏览器驱动,timeout就是等待的时长,until后是判断元素是否出现的
wdw = WebDriverWait(driver, timeout=10).until(lambda d: d.find_element(By.CLASS_NAME, "lm_tabe"))
# network记录,这里可以获得所有ajax请求的结果
# logs = get_xhr_logs(driver)
# 动态加载后的网页
html = driver.page_source
# 退出浏览器
driver.quit()
return scrapy.http.HtmlResponse(url=request.url, body=html.encode('utf-8'), encoding='utf-8', request=request)
DOWNLOADER_MIDDLEWARES = {
'announcement.middlewares.SeleniumMiddleware': 543,
}
有些网站加了一层对selenium 的检测来防止一些爬虫。基本都是对window.navigator.webdriver属性的检测,只要将此属性置成undefined即可。但是driver.execute_script()方法是在页面加载后执行的。而反屏蔽检测是在页面渲染之前就执行了。我们可以使用本地代理的方式来绕过(后面几章会讲到),但这里我们使用更简便的方式:使用CDP(Chrome Devtools-Protocol,Chrome 开发工具协议)来解决。
典型的selenium反屏蔽网站:Scrape | Movie
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
if __name__ == '__main__':
# 初始浏览器驱动
options = webdriver.ChromeOptions()
# 隐藏提示条
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 隐藏自动化扩展信息
options.add_experimental_option('useAutomationExtension', False)
# 初始化驱动
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)
# 退出驱动实例
driver.quit()