# scrapy-selenium **Repository Path**: qinbo28/scrapy-selenium ## Basic Information - **Project Name**: scrapy-selenium - **Description**: 将selenium作为中间件集成到scrapy中。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-11-08 - **Last Updated**: 2023-09-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Scrapy-Selenium Scrapy 中间件处理js动态加载页面。 ## 安装 ```shell $ pip install ``` python版本必须大于3.6。 ## Scrapy配置 1. 添加处理网页的浏览器和浏览器驱动的可执行文件的路径,和相关驱动的配置。 ```python from shutil import which SELENIUM_DRIVER_NAME = 'chrome' SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver.exe') SELENIUM_DRIVER_ARGUMENTS=['--headless'] # browser headless mode. ``` 可选配置,可以设置`SELENIUM_BROWSER_EXECUTABLE_PATH = which('chrome')` 如果想使用远程Selenium服务,就需要指定`SELENIUM_COMMAND_EXECUTOR`而不是`SELENIUM_DRIVER_EXECUTOR_PATH`,`SELENIUM_COMMAND_EXECUTOR = 'http://localhost:4444/wd/hub'` 1. 添加`SeleniumMidleware`到下载器中间件中 ```python DOWNLOADER_MIDDLEWARES = { 'scrapy_selenium.SeleniumMiddleware': 800, } ``` ## 使用 使用`scrapy_selenium.SeleniumRequest`替代*Scrapy*内置的`Request`去处理页面请求,使用如下: ```python from scrapy_selenium import SeleniumRequest yield SeleniumRequest(url=url, callback=self.parse) ``` 我习惯使用`start_requests`方法: ```python def start_requests(self): start_urls = ['https://iimh.net/',] for url in start_urls: yield SeleniumRequest( url=url, callback=self.parse ) ``` 更多关于`start_requests`方法查看*Scrapy*文档。 页面请求将会通过selenium处理,请求中也会增加一个`meta`键,名称为`driver`其中含有和*selenium driver*相关的处理请求的方法和属性。 ```python def parse(self, response): print(response.request.meta['driver'].title) ``` 更多关于*selenium driver*的信息参见 selenium python doc。 选择器`selector`使用和`scrapy`之前的用法一样,只是响应结果是由*selenium driver*得到的。 ```python def parse(self, response): print(respons.xpath("//div[@id='viewimages']/img[1]/@src").get()) ``` ## 其他配置 `scrapy_selenium.SeleniumRequest`接收4个额外的参数。 ### `wait_time`/`wait_until` 使用上述的参数,和使用*selenium*一样,浏览器会执行特定的等待,等待完成后才会将响应结果传给爬虫。 ```python from scrapy_selenium import SeleniumRequest from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC yield SeleniumRequest( url=url, callback=self.parse, wait_time=10, wait_until=EC.element_to_be_clicable((By.ID, 'login')) ) ``` ### `screenshot` 使用这个参数浏览器将会对网页进行截图并保存为.png文件, 相关信息会被添加到响应中的`meta`中。 ```python yield SeleniumRequest( url=url, callback=self.parse, screenshot=True ) def parser(self, response): with open('image.png', 'wb') as image_file: image_file.write(response.meta['screenshot']) ``` ### `script` 可以执行自定义*JavaScript*代码。 ```python yield SeleniumRequest( url=url, callback=self.parse, script='window.scrollTo(0, document.body.scrollHeight);', ) ``` ## TODO 1. 解决有些网页加载过慢,导致爬虫没有得到想要的数据。 2. 添加更多关于*selenium*的配置,例如页面加载策略等。