scrapy下载器中间件

需要用scrapy爬取执行js后的网页。
部分scrapy代码:

spider.py:

class Myspider(Spider):
    name = 'myspider'
    start_url = [....]
    ...
    
    def parse(self, response):
    """
    解析文章列表
    """
        urls = response.xpath(....)
        for url in urls:
            request = Request(url=url, callback=self.parse_post, dont_filter=True)
            yield request
    
    
    def parse_post(self, response):
    """
    解析正文
    """
    item = myItem()
    ...

middleware.py:

class PhantomJSMiddleware(object):
    @classmethod
    def process_request(cls, request, spider):

        if request.meta.has_key('PhantomJS'):
            try:
                driver = webdriver.PhantomJS()  # 可能需要指定路径
                driver.get(request.url)
                content = driver.page_source.encode('utf-8')
                url = driver.current_url.encode('utf-8')
                driver.quit()
                return HtmlResponse(url, encoding='utf-8', body=content, request=request)
            except Exception as e:
                log.msg('PhantomJS Exception: ' + str(e), level=log.WARNING)
                return HtmlResponse(request.url, encoding='utf-8', status=503, body='')

我遇到的问题是:爬虫进入下载器中间件,返回HtmlResponse后,不会再进入解析正文的parse_post函数;但是如果不添加下载器中间件,就可以正常解析正文。
请问下载器中间件该如何编写,才能让返回的response进入parse_post函数

阅读 4.9k
1 个回答

貌似没有在Response.meta中设置PhantomJS, 所以你的process_request中的if分支没有走到?动态加载JS我推荐splash

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题