Scrapy linkextractor会忽略符号#后面的参数,因此不会跟随该链接

时间:2019-01-06 11:36:39

标签: scrapy

我正在尝试抓取一个网站,其中的分页符位于符号“#”的后面。这种方式使scrapy忽略了该字符后面的所有内容,并且始终只能看到第一页。

例如:

  

http://www.rolex.de/de/watches/find-rolex.html#g=1&p=2

如果您手动输入问号,该网站将加载第1页

  

http://www.rolex.de/de/watches/find-rolex.html?p=2

scrapy的统计信息告诉我它进入了第一页:

  

调试:已爬网(200)http://www.rolex.de/de/watches/datejust/m126334-0014.html>(参考:   http://www.rolex.de/de/watches/find-rolex.html

我的搜寻器如下所示:

start_urls = [
    'http://www.rolex.de/de/watches/find-rolex.html#g=1',
    'http://www.rolex.de/de/watches/find-rolex.html#g=0&p=2',
    'http://www.rolex.de/de/watches/find-rolex.html#g=0&p=3',
]

rules = (
    Rule(
        LinkExtractor(allow=['.*/de/watches/.*/m\d{3,}.*.\.html']), 
        callback='parse_item'
    ),       
    Rule(
        LinkExtractor(allow=['.*/de/watches/find-rolex(/.*)?\.html#g=1(&p=\d*)?$']), 
        follow=True
    ),
)

如何让scrapy忽略url中的#并访问给定的URL?

1 个答案:

答案 0 :(得分:1)

Scrapy执行HTTP请求。 URL中“#”之后的数据不是HTTP请求的一部分,它由JavaScript使用。

如评论中所建议,该站点使用AJAX加载数据。

此外,它不使用AJAX中的分页:该站点在单个请求中以JSON格式下载整个手表列表,然后使用JavaScript进行分页。

因此,您可以仅使用Web浏览器开发人员工具的“网络”标签来查看获取JSON数据的请求,并执行类似的请求,而不是请求HTML页面。

但是请注意,您不能将LinkExtractor用于JSON数据。您只需使用Python的json解析响应,然后在其中迭代URL。