python - scrapy下载器中间件

 liujiayan0529_584 发布于 2022-10-27 07:35

需要用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函数

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

    2022-11-12 01:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有