0

我是 webscraping 的初学者,我可能会问错误的问题:) 为了工作 scrapy+selenium 我创建了中间件

class SeleniumDownloaderMiddleware(object):
    def __init__(self):
        self.driver = None
    @classmethod
    def from_crawler(cls, crawler):
        middleware = cls()
        crawler.signals.connect(middleware.spider_opened,\ 
    signals.spider_opened)
        crawler.signals.connect(middleware.spider_closed,\ 
    signals.spider_closed)
        return middleware
    def process_request(self, request, spider):
        try:
        # JS processing
            self.driver.get(request.url)
            body = to_bytes(self.driver.page_source)
            return HtmlResponse(self.driver.current_url, body=body,\ 
        encoding='utf-8', request=request)
       # CRASH ERROR
            except (WebDriverException, NoSuchWindowException):
            SeleniumDownloaderMiddleware.spider_opened(self, spider)
            self.driver.get(request.url)
            body = to_bytes(self.driver.page_source)
            return HtmlResponse(self.driver.current_url, body=body,/ 
       encoding='utf-8', request=request)

    def spider_opened(self, spider):
        #BAN ON DOWNLOADING
        options.add_experimental_option("prefs", {
        "download.default_directory": "NUL",
        "download.prompt_for_download": False,
         })
         options.add_argument('--ignore-certificate-errors')
         options.add_argument("--test-type")
         self.driver = webdriver.Chrome(chrome_options=options)
    def spider_closed(self, spider):
         if self.driver:
             self.driver.close()
             self.driver.quit()
             self.driver = None

现在来自scrapy的任何请求都首先进入这个selenium中间件,但我想在不使用这个中间件的情况下保存pdf,只进入scrapy spider

    def parse(self, response):
    # PDF
        for href in response.css('a[href$=".pdf"]::attr(href)').extract() +\
                response.css('a[href$=".PDF"]::attr(href)').extract():
        url = response.urljoin(href)
        yield Request(url=response.urljoin(href), callback=self.save_pdf, 
        priority=1)
    def save_pdf(self, response):
        path = response.url.split('/')[-1]
        self.logger.info('Saving PDF %s', path)
        self.counter += 1
        with open(os.path.join(self.folder, str(self.counter)), 'wb') as 
        file:
        file.write(response.body)

我如何构建scrapy请求以忽略硒中间件?

4

2 回答 2

1

考虑使用现有的scrapy-selenium Scrapy 扩展。它的工作方式使得在没有 Selenium 的情况下下载特定 URL 变得非常容易。

或者,根本不要使用 Selenium。通常,从 Scrapy 开始的人们想要使用 Selenium 可以在没有 Splash 或 Selenium 的情况下实现。查看是否可以使用 scrapy 从使用 AJAX 的网站中抓取动态内容的答案?

于 2019-04-14T05:53:41.020 回答
0

您可以在 process_request 中对 request.url 设置条件并跳过任何处理。

if request.url.endswith('.pdf'):
    pass

这应该传递给下一个中间件,或者您可以在那里下载并返回。

于 2019-04-10T05:24:45.430 回答