scrapy Rule如何解析json格式的链接?

rules = {
    'sina':(
        Rule(LinkExtractor(allow='/\d+-\d+-\d+\/.*?-.*?.shtml', deny=('http://search.sina.com.cn/.*?')),
             callback='parse_item', follow=True),
        )
}

如上,目的是从目标页面解析出符合条件的链接
目标页面示例:https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=1&encode=utf-8&callback=feedCardJsonpCallback&_=1545017197742
试了很多正则的方法,都匹配不出来"urls":"[\"https:\\\/\\\/news.sina.com.cn\\\/o\\\/2018-12-18\\\/doc-ihqhqcir7816653.shtml\"]"这里面的链接,正则表达式测试过没问题,但是在scrapy 的Rule里就不行

阅读 2k
1 个回答

方便起见,先贴出你的部分源码:

class SinacrawlSpider(CrawlSpider):
    name = 'Sinacrawl'
    allowed_domains = ['sina.com.cn']
    start_urls = ['https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=1&encode=utf-8&callback=feedCardJsonpCallback&_=1545017197742']

    rules = (
        Rule(LinkExtractor(allow='.*?\.shtml',deny=('http://search.sina.com.cn/.*?')), callback='parse_item', follow=True),
        Rule(LinkExtractor(allow='a[href^="http"]'), follow=True)
    )

    def parse_item(self, response):
        item = SinacrawlItem()

不是正则的问题,我试验了LinkExtractor(allow=()),仍然不会进入parse_item函数。
查看scrapy的源码可知,scrapy\spiders\crawl.py,line 56, _requests_to_follow函数

    def _requests_to_follow(self, response):
        if not isinstance(response, HtmlResponse):
            return
        seen = set()
        for n, rule in enumerate(self._rules):
            links = [lnk for lnk in rule.link_extractor.extract_links(response)
                     if lnk not in seen]
            if links and rule.process_links:
                links = rule.process_links(links)
            for link in links:
                seen.add(link)
                r = self._build_request(n, link)
                yield rule.process_request(r)

如果response不是HtmlResponse类型,那么不做进一步解析。
题主的连接返回的不是html页面。

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