Как сделать запрос в скрапе, чтобы избежать селенового промежуточного программного обеспечения? - PullRequest
0 голосов
/ 10 апреля 2019

Я новичок в веб-спрайсинге, и, возможно, я задаю неправильный вопрос:) Для работы Scrapy + Selen я создал промежуточное ПО

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 сначала попадает в это промежуточное ПО для селена, но я хочу сохранить pdf без использования этого промежуточного ПО, только для паука scrapy

    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)

Как я могу создать запрос на терапию, чтобы игнорировать промежуточное программное обеспечение селена?

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Рассмотрите возможность использования существующего расширения scrapy-selenium Scrapy. Он работает таким образом, что позволяет довольно просто загружать определенные URL без Selenium.

В качестве альтернативы, вообще не используйте селен. Часто то, что люди, начинающие со Scrapy, хотят делать с Selenium, можно достичь без Splash или Selenium. См. Ответы на Можно ли использовать скрап для очистки динамического контента с веб-сайтов, использующих AJAX?

0 голосов
/ 10 апреля 2019

Вы можете поместить условие в request.url в process_request и пропустить любую обработку.

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

Это должно перейти к следующему промежуточному программному обеспечению, или вы можете скачать его прямо здесь и вернуться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...