Как использовать селеновую страницу в Scrapy? - PullRequest
0 голосов
/ 18 апреля 2019

Я занимаюсь разработкой универсального поискового робота с помощью Scrapy.Но некоторые страницы веб-сайтов переворачиваются на javascript, мне нужно добавить промежуточное программное обеспечение для селена на страницу и получить все детали URL.

Некоторая проблема беспокоит меня в том, что промежуточное программное обеспечение селен всегда возвращает Htmlresponse для функции синтаксического анализа, чтобы разобрать детали. Но теперь я получаю URL-адрес детали, который не запрашивается, только html-содержимое подробного списка URL-адресов. Как мне вернуться в промежуточное ПО? могу получить весь подробный контент и правильно отправить в функцию разбора в Spider.Я пытаюсь использовать yield yield, но он не работает.

class SeleniumMiddleware(object):
    def process_request(self, request, spider):
        if spider.selenium :
            chrome_options = Options()
            chrome_options.add_argument('--headless')
            chrome_options.add_argument('--disable-gpu')
            browser = webdriver.Chrome(options=chrome_options)
            browser = browser.get(request.url)
            wait = WebDriverWait(browser, 10)
            urls = []
            max_page = 1
            try:
                for i in range(max_page):
                    href = browser.find_element_by_class_name('zsy_tb').find_elements_by_tag_name('a')
                    next_page = wait.until(EC.presence_of_element_located((By.LINK_TEXT, 'next')))
                    for a in href:
                        urls.append(a.get_attribute('href'))
                    next_page.click()
                for i in urls:
                    yield Request(a.get_attribute('href'), callback=spider.parse_item)
                    # return HtmlResponse(url=request.url, body=browser.page_source, request=request, encoding='utf-8', status=200)
            except:
                pass
def parse_item(self, response,PID=None):

    item = self.config.get('item')
    if item:
        cls = eval(item.get('class'))()
        loader = eval(item.get('loader'))(cls, response=response)
        for key, value in item.get('attrs').items():
            for extractor in value:
                if extractor.get('method') == 'xpath':
                    loader.add_xpath(key, extractor.get('args'), **{'re': extractor.get('re')})
                if extractor.get('method') == 'css':
                    loader.add_css(key, extractor.get('args'), **{'re': extractor.get('re')})
                if extractor.get('method') == 'value':
                    loader.add_value(key, *extractor.get('args'), **{'re': extractor.get('re')})
                if extractor.get('method') == 'attr':
                    loader.add_value(key, eval(*extractor.get('args')))
        yield loader.load_item()

Если вы, ребята, имеете более эффективный метод, должны сказать мне. Мой английский не очень хорошо, некоторые детали могут быть не описаны четко. Пожалуйста, прости меня.

...