scrapy 使用selenium作为下载中间件

最近在做scrapy项目的时候, 需要异步渲染动态的网页,自己构建了一个selenium 异步渲染的下载中间件

1.爬虫发送请求的时候需要携带参数
Request(
       url=url,
       meta={"is_selenium": True},
       callback=self.parse,
       dont_filter=True,
   )
2.中间件代码
class SeleniumMiddleware(object):
    """selenium模拟渲染"""

    def __init__(self):
        self.options = webdriver.ChromeOptions()
        self.options.add_argument('-headless')
        self.options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 忽略证书错误
        self.options.add_argument('--ignore-certificate-errors')
        self.driver = webdriver.Chrome(executable_path="C:\chromedriver.exe", options=self.options)

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
        return s

    def spider_closed(self):
        self.driver.close()

    def process_request(self, request, spider):
        is_selenium = request.meta.get('is_selenium', False)
        if is_selenium:
            try:
                self.driver.get(request.url)
            except TimeoutException:
                self.driver.execute_script('window.stop()')
                return HtmlResponse(url=request.url, status=666, encoding='utf-8')
            time.sleep(1)
            url = self.driver.current_url
            body = self.driver.page_source
            return HtmlResponse(url=url, body=body, status=200, encoding='utf-8')
注意事项

使用中间件的时候注意资源的释放,需要监控爬虫结束的信号,在爬虫结束的时候,关闭掉selenium的driver。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于这个问题,可以参考以下代码: 在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",实际使用时需要根据自己的情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值