首页 > 解决方案 > 修改scrapy进程请求

问题描述

import scrapy
from selenium import webdriver
from scrapy.loader import ItemLoader
from scrapy.loader.processors import Join,MapCompose
from scrapy.crawler import CrawlerProcess
from scrapy.http import HtmlResponse
class TestSpider(scrapy.Spider):
    name = "plus"
    start_urls = ['http://httpbin.org/anything']
    def __init__(self):
        scrapy.Spider.__init__(self)
        options = webdriver.ChromeOptions()
        options.add_argument('--ignore-certificate-errors')
        options.add_argument("disable-infobars")
        options.add_argument('--disable-browser-side-navigation')
        options.add_argument("--start-maximized")
        self.driver = webdriver.Chrome(chrome_options=options)


    def __del__(self):
        try:
            scrapy.Spider.__del__(self)
        except:
            print("No __del__ method")

    def process_request(self, request, spider):
        self.driver.get(request.url)
        body = self.driver.page_source
        print(body)
        return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)
    def parse(self,response):
        print(response.text)

        self.driver.quit()

process = CrawlerProcess({'LOG_LEVEL':'INFO',
                        })
process.crawl(TestSpider)
process.start()

我遇到的问题是process_request当scrapy发出请求时没有调用它。如何操纵 Scrapy 处理请求的方式,这样我就不会发出两个请求,一个通过 Scrapy,一个通过 Selenium。

标签: pythonseleniumscrapy

解决方案


阿姆贾斯德。 wishmaster是完全正确的,你应该使用下载中间件并将 Selenium 放在那里。但这不是一个好主意,因为在这种情况下,您的爬虫将是同步的。一个更好的主意是使用与水族馆合作的 Splash 或 Splash cluster


推荐阅读