middleware中selenium模拟点击分页时,每页pagesource传递

来源:9-4 selenium集成到scrapy中

hi_Rengar

2019-03-25

class SeleniumMiddleware(object):
    def process_request(self, request, spider):
        if spider.name == 'gome':
            gome_type = request.meta.get('gomeType', 0)
            log.msg('gome type: %s' % gome_type)
            spider.browser.get(request.url)
            if gome_type == 2:
                while True:
                    spider.browser_wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="min-pager-number"]')))
                    # TODO 分页数据处理
                    pager_souce = spider.browser.page_source
                    pager_text = spider.browser.find_element_by_xpath('//*[@id="min-pager-number"]').text()
                    pager_list = re.findall(u"\d+", pager_text)
                    if len(pager_list) == 2 and int(pager_list[0]) < int(pager_list[1]):
                        spider.browser.find_element_by_xpath('//*[@id="mp-next"]').click()
                    else:
                        break

            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8",
                                request=request)
        pass

现在的问题是middleware中只能返回一次pagesource,如果pagesource的解析和存储都在middleware中,那scrapy用不用无所谓了。。

写回答

1回答

bobby

2019-03-27

当然可以把解析和存储都放在middleware中,但是你这样代码的逻辑就混淆了。middleware中就是用来处理response的,后续的处理逻辑应该放在对应的地方,即使你自己写代码不也是需要将这些逻辑分离吗?如果放在一起代码的后期维护会很痛苦的

0
6
bobby
回复
hi_Rengar
能截图举例说一下吗?我帮你分享一下你为什么不需要两个response?或者通过其他方式解决
2019-04-09
共6条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5795 学习 · 6290 问题

查看课程