【问题标题】:Scrapy linkextractor ignores parameters behind the sign # and thus will not follow the linkScrapy 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?

【问题讨论】:

  • 打印结果页面的源代码并查看 HTML 是否可用或您需要的数据是否正在 AJAX 上加载

标签: scrapy


【解决方案1】:

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

根据 cmets 的建议,该站点使用 AJAX 加载数据。

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

因此,您可以只使用 Web 浏览器的开发人员工具的 Network 选项卡来查看获取 JSON 数据的请求,并执行类似的请求,而不是请求 HTML 页面。

但请注意,您不能将 LinkExtractor 用于 JSON 数据。您应该简单地使用 Python 的 json 解析响应并在那里迭代 URL。

【讨论】:

  • 谢谢。我就是这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2015-08-10
相关资源
最近更新 更多