请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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用不用无所谓了。。

正在回答 回答被采纳积分+3

1回答

bobby 2019-03-27 16:29:29

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

0 回复 有任何疑惑可以回复我~
  • 提问者 hi_Rengar #1
    现在的问题是,有很多页数据,但是middleware只能return 一页数据
    回复 有任何疑惑可以回复我~ 2019-03-29 11:07:33
  • bobby 回复 提问者 hi_Rengar #2
    你的下一页数据应该是在下一轮page处理的时候返回 还是说你想在一个url的response返回多个页面?
    回复 有任何疑惑可以回复我~ 2019-04-01 10:54:27
  • 提问者 hi_Rengar 回复 bobby #3
    在一个url的response返回多个页面
    回复 有任何疑惑可以回复我~ 2019-04-04 18:42:53
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号