如何在Scrapy中使用硒翻页?

时间:2019-04-18 02:45:55

标签: python scrapy web-crawler

我正在用Scrapy开发一个通用的Web搜寻器。但是某些网站是通过javascript翻页的,我需要添加一个硒中间件来对其进行分页并获取所有详细的URL。

一些问题困扰着我,硒中间件总是返回Htmlresponse到parse的功能来解析细节。但是现在我没有收到详细网址,只是一个详细网址列表的html内容。我应该如何在中间件中返回?可以获取所有详细内容并正确发送到Spider中的解析功能。我尝试使用yield Request,但是它不起作用。

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()

如果你们有更有效的方法,请告诉我。我的英语不好,某些细节可能无法清楚描述。请原谅我。

0 个答案:

没有答案