Scrapy第十一(①)篇:selenium4模拟器中间件

为什么要使用模拟器?

在使用request的时候,大型网站都有很多的反爬机制,典型比如滑动验证码、弹窗广告、弹窗验证、登录认证、Ajax异步加载...等等,这些是request很难绕过去的。这时候可以使用selenium模拟器来模拟用户操作:Selenium可以根据的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生等.

目录

1.安装依赖(已经安装过的,请先卸载再安装,确保是最新版本)

2.验证版本

3.下载驱动(两种方式二选一)

4.测试Selenium4:访问百度并搜索

5.编写中间件:打开middlewares.py文件,新建中间件SeleniumMiddleware

6.开启中间件:打开settings.py

7.selenium反屏蔽


1.安装依赖(已经安装过的,请先卸载再安装,确保是最新版本)

pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

2.验证版本

pip list

Scrapy第十一(①)篇:selenium4模拟器中间件_第1张图片

3.下载驱动(两种方式二选一)

① 使用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

4.测试Selenium4:访问百度并搜索

Scrapy第十一(①)篇:selenium4模拟器中间件_第2张图片

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()

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):
        # 初始化驱动
        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)

6.开启中间件:打开settings.py

DOWNLOADER_MIDDLEWARES = {
    'announcement.middlewares.SeleniumMiddleware': 543,
}

7.selenium反屏蔽

有些网站加了一层对selenium 的检测来防止一些爬虫。基本都是对window.navigator.webdriver属性的检测,只要将此属性置成undefined即可。但是driver.execute_script()方法是在页面加载后执行的。而反屏蔽检测是在页面渲染之前就执行了。我们可以使用本地代理的方式来绕过(后面几章会讲到),但这里我们使用更简便的方式:使用CDP(Chrome Devtools-Protocol,Chrome 开发工具协议)来解决。

典型的selenium反屏蔽网站:Scrape | Movie

Scrapy第十一(①)篇:selenium4模拟器中间件_第3张图片

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()

你可能感兴趣的:(scrapy,scrapy,selenium,测试工具)