【问题标题】:Scrapy is filtering unique urls as duplicate urlsScrapy 将唯一的 url 过滤为重复的 url
【发布时间】:2017-06-21 03:07:00
【问题描述】:

网址:

  1. http://www.extrastores.com/en-sa/products/mobiles/smartphones-99500240157?page=1
  2. http://www.extrastores.com/en-sa/products/mobiles/smartphones-99500240157?page=2 是独一无二的,但scrapy 将这些 url 过滤为重复而不是抓取它们。

我正在使用具有以下规则的 CrawlSpider:

rules = (
    Rule(LinkExtractor(restrict_css=('.resultspagenum'))),
    Rule(LinkExtractor(allow=('\/mobiles\/smartphones\/[a-zA-Z0-9_.-]*',), ), callback='parse_product'),
)`

我不明白这种行为,有人可以解释一下吗?上周,相同的代码正在运行。 使用 Scrapy 1.3.0 版

【问题讨论】:

  • 你确定他们还没有被访问过吗?
  • 是的,整个网站都没有被废弃。所有链接都被过滤掉了。
  • 可能链接被抓取,但页面上没有数据?
  • 我可以在 shell 中下载/抓取单个链接的数据,上述链接在 scrapy shell 中工作正常。
  • 我建议你分享你的爬取日志,也许你的蜘蛛也是如此。默认指纹函数为您的 2 个示例 URL 生成不同的指纹。所以scrapy不应该过滤所有page=<digit>,因为它们已经被提取了,所以它正在过滤它们。如果没有带有LOG_LEVEL='DEBUG' 或代码或两者兼有的日志,就不能说更多了。

标签: python scrapy scrapy-spider


【解决方案1】:

按照@paul trmbrth 的建议,我重新检查了正在被抓取的代码和网站。 Scrapy 正在下载链接并过滤链接,因为它们是之前下载的。问题是 html 的“a”标签中的链接属性已从静态链接更改为某些 javascript 函数:

<a href='javascript:gtm.traceProductClick("/en-sa/mobiles/smartphones/samsung-galaxy-s7-32gb-dual-sim-lte-gold-188024">

相应地我将我的蜘蛛代码更改为:

    def _process_value(value):
    m = re.search('javascript:gtm.traceProductClick\("(.*?)"', value)
    if m:
        return m.group(1)


rules = (
    Rule(LinkExtractor(restrict_css=('.resultspagenum'))),
    Rule(LinkExtractor(
        allow=('\/mobiles\/smartphones\/[a-zA-Z0-9_.-]*',),
        process_value=_process_value
    ), callback='parse_product'),
)

这不是scrapy过滤非唯一网址的问题,而是关于从'a'标签中提取'href'属性的链接,因为该链接最近已更改并且我的代码已损坏。 再次感谢@paul trmbrth

【讨论】:

    猜你喜欢
    • 2012-09-15
    • 2011-07-12
    • 1970-01-01
    • 2016-03-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多