【问题标题】:Scraping site that uses AJAX使用 AJAX 的抓取网站
【发布时间】:2016-04-18 07:36:04
【问题描述】:

我在这里阅读了一些相关的帖子,但找不到答案。

我正在尝试抓取带有评论的网页。访问网站时,最初只有 10 条评论,用户每次滚动时都应按“显示更多”以获得更多 10 条评论(这也将 #add10 添加到网站地址的末尾)一直到评论列表的末尾。实际上,用户可以通过将 #add1000(其中 1000 是附加评论的数量)添加到网站地址的末尾来获得完整的评论列表。问题是我在我的蜘蛛中使用 site_url#add1000 只能获得前 10 条评论,就像使用 site_url 一样,所以这种方法不起作用。

我也找不到一种方法来做出适当的请求来模仿来自站点的原始请求。原始 AJAX url 的格式为“domain/ajaxlst?par1=x&par2=y”,我尝试了所有这些:

Request(url='domain/ajaxlst?par1=x&par2=y', callback=self.parse_all) 
Request(url='domain/ajaxlst?par1=x&par2=y', callback=self.parse_all,
        headers={all_headers})
Request(url='domain/ajaxlst?par1=x&par2=y', callback=self.parse_all,
        headers={all_headers}, cookies={all_cookies})

但每次我收到 404 错误。谁能解释我做错了什么?

【问题讨论】:

    标签: python ajax scrapy


    【解决方案1】:

    通常,当您向下滚动页面时,Ajax 会向服务器发送请求,然后服务器会向您的浏览器响应一个 json/xml 文件以刷新页面。

    你需要找出链接到这个 json/xml 文件的 url。通常,您可以打开 Firefox 浏览器并打开工具/Web 开发/Web 控制台。监控网络活动,您可以轻松捕获此 json/xml 文件。

    找到此文件后,您可以直接从中解析评论(我推荐 Python Module requests 和 bs4 来完成这项工作)并减少大量时间。请记住使用一些不同的客户端和 IP。善待服务器,它不会阻止你。

    【讨论】:

    • 谢谢!你能告诉我如何组织我的计划吗?
    • 现在很简单。脚本每天一次完全解析网站(所有链接和页面)以获得新评论。但我意识到这不是最好的方法: 1.) 我延迟了一天得到新的评论; 2.) 可能不需要每次都解析来自站点的所有信息。现在我正在考虑每小时仅向首页页面发送一次头部请求,并且仅解析首页并且仅在它们已更改时才解析。这是一个好方法吗?我的头部请求不会过多地干扰网站吗?有没有更好的方法?谢谢!
    • 我认为它会起作用,因为您不会发送太多请求。
    【解决方案2】:

    你需要的是一个无头浏览器,因为请求模块不能很好地处理 AJAX。

    其中一个无头浏览器是selenium。

    即)

    driver.find_element_by_id("show more").click() # This is just an example case
    

    【讨论】:

    • 嗯,我以前用过 selenium + phantomjs,但速度相对较慢。你确定这里没有更好的方法吗?
    • @AlexK。还有其他方法可以看到这个stackoverflow.com/questions/16390257/…,但我不知道导航等等。
    • 谢谢。我在我的代码中发现了一个错误 - 实际上,我错过了标题中的 'x-requested-with': 'XMLHttpRequest' 行并且没有人能注意到它,因为我没有提供这部分代码......因为你的答案建议另一种解决问题的适当方法,我将其标记为解决方案。
    • @AlexK。当您提供代码示例时会发生这种情况,有时您会忘记重要的 sn-p 并尝试提供 URl 以供其他人检查:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2018-12-23
    • 2019-06-21
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多