我正在尝试抓取一个网站,其中的分页符位于符号“#”的后面。这种方式使scrapy忽略了该字符后面的所有内容,并且始终只能看到第一页。
例如:
如果您手动输入问号,该网站将加载第1页
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?
答案 0 :(得分:1)
Scrapy执行HTTP请求。 URL中“#”之后的数据不是HTTP请求的一部分,它由JavaScript使用。
如评论中所建议,该站点使用AJAX加载数据。
此外,它不使用AJAX中的分页:该站点在单个请求中以JSON格式下载整个手表列表,然后使用JavaScript进行分页。
因此,您可以仅使用Web浏览器开发人员工具的“网络”标签来查看获取JSON数据的请求,并执行类似的请求,而不是请求HTML页面。
但是请注意,您不能将LinkExtractor
用于JSON数据。您只需使用Python的json
解析响应,然后在其中迭代URL。