scrapy对接selenium中间件怎么编写代码
时间: 2023-10-13 19:21:56 浏览: 129
对于这个问题,可以参考以下代码:
在settings.py文件中添加以下内容:
```python
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
'yourproject.middlewares.RandomUserAgentMiddleware': 400,
'yourproject.middlewares.JavaScriptMiddleware': 543,
}
```
其中,RandomUserAgentMiddleware用于设置随机User-Agent,JavaScriptMiddleware是自定义的中间件,用于启动selenium并完成页面渲染。
以下是JavaScriptMiddleware的代码:
```python
from pyvirtualdisplay import Display
from selenium import webdriver
from scrapy.http import HtmlResponse
class JavaScriptMiddleware(object):
@classmethod
def process_request(self, request, spider):
if spider.name == "spider_name":
#启动虚拟桌面
display = Display(visible=0, size=(800, 600))
display.start()
#设置ChromeDriver选项
options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--headless")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--remote-debugging-port=9222")
options.add_argument('--disable-blink-features=AutomationControlled')
#启动Chrome浏览器
driver = webdriver.Chrome(options=options)
driver.get(request.url)
#获取页面渲染结果
body = driver.page_source
url = driver.current_url
#关闭Chrome浏览器和虚拟桌面
driver.quit()
display.stop()
#返回HtmlResponse对象
return HtmlResponse(url=url, body=body, encoding='utf-8', request=request)
```
需要注意的是,这里将spider的name设置为"spider_name",实际使用时需要根据自己的情况进行修改。
阅读全文