Python 使用AJAX的抓取站点

Python 使用AJAX的抓取站点,python,ajax,scrapy,Python,Ajax,Scrapy,我在这里读过一些相关的帖子,但想不出答案 我正试图抓取一个包含评论的网页。访问站点时,最初只有10条评论,用户每次向下滚动到评论列表末尾时,应按“显示更多”以获得10条评论(这也会在站点地址末尾添加#add10)。实际上,用户可以通过在站点地址的末尾添加#add1000(其中1000是一些附加评论)来获得完整的评论列表。问题是,我在spider中使用site#url#add1000只获得前10条评论,就像使用site#url一样,所以这种方法不起作用 我也找不到一个方法来提出一个适当的要求,模仿

我在这里读过一些相关的帖子,但想不出答案

我正试图抓取一个包含评论的网页。访问站点时,最初只有10条评论,用户每次向下滚动到评论列表末尾时,应按“显示更多”以获得10条评论(这也会在站点地址末尾添加#add10)。实际上,用户可以通过在站点地址的末尾添加#add1000(其中1000是一些附加评论)来获得完整的评论列表。问题是,我在spider中使用site#url#add1000只获得前10条评论,就像使用site#url一样,所以这种方法不起作用

我也找不到一个方法来提出一个适当的要求,模仿源一个从网站。Origin 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错误。有人能解释一下我做错了什么吗?

因为请求模块不能很好地处理AJAX,所以您需要一个无头浏览器

这样的无头浏览器之一是

i、 e.)


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

这样的无头浏览器之一是

i、 e.)


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

您需要找出链接到此json/xml文件的url。通常,您可以打开firefox浏览器并打开tools/web dev/web控制台。监视网络活动,您可以轻松捕获此json/xml文件


一旦找到这个文件,就可以直接解析来自它们的评论(我建议使用Python模块请求和bs4来完成这项工作),从而减少大量的时间。记住使用一些不同的客户端和IP。善待服务器,它不会阻止您。

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

您需要找出链接到此json/xml文件的url。通常,您可以打开firefox浏览器并打开tools/web dev/web控制台。监视网络活动,您可以轻松捕获此json/xml文件


一旦找到这个文件,就可以直接解析来自它们的评论(我建议使用Python模块请求和bs4来完成这项工作),从而减少大量的时间。记住使用一些不同的客户端和IP。善待服务器,它不会阻止您。

我以前使用过selenium+phantomjs,但速度相对较慢。你确定这里没有更好的办法吗?@AlexK。还有其他方法可以看到这一点,但我不知道导航和所有。谢谢。我在我的代码中发现了一个错误-实际上,我在标题中遗漏了“x-request-with”:“XMLHttpRequest”行,没有人注意到,因为我没有提供这部分代码。。。因为你的回答暗示了另一种解决问题的适当方法,所以我把它标记为解决方案。@AlexK。当你忘记了重要的代码片段,并试图提供URl供其他人检查时,就会出现这种情况:-)好吧,我以前使用过selenium+phantomjs,但速度相对较慢。你确定这里没有更好的办法吗?@AlexK。还有其他方法可以看到这一点,但我不知道导航和所有。谢谢。我在我的代码中发现了一个错误-实际上,我在标题中遗漏了“x-request-with”:“XMLHttpRequest”行,没有人注意到,因为我没有提供这部分代码。。。因为你的回答暗示了另一种解决问题的适当方法,所以我把它标记为解决方案。@AlexK。当你忘记了重要的代码片段,并试图提供URl供其他人检查时,就会出现这种情况:-)谢谢!你能建议我如何组织我的节目吗?现在很简单。脚本每天一次完全解析站点(所有链接和页面)以获得新的评论。但我意识到这并不是最好的方法:1)我得到了新的评论,但延迟了一天;2.)可能没有必要每次都解析来自站点的所有信息。现在,我正在考虑每小时只向第一个站点页面发送一次head请求,并且只解析第一个页面,并且只在这些页面被更改时进行解析。这是一个好方法吗?我的头部请求会不会对网站造成太多干扰?有更好的方法吗?非常感谢。我想它会有用的,因为你不会发送太多的请求。谢谢!你能建议我如何组织我的节目吗?现在很简单。脚本每天一次完全解析站点(所有链接和页面)以获得新的评论。但我意识到这并不是最好的方法:1)我得到了新的评论,但延迟了一天;2.)可能没有必要每次都解析来自站点的所有信息。现在,我正在考虑每小时只向第一个站点页面发送一次head请求,并且只解析第一个页面,并且只在这些页面被更改时进行解析。这是一个好方法吗?我的头部请求会不会对网站造成太多干扰?有更好的方法吗?非常感谢。我认为它会起作用,因为你不会发送太多的请求。
driver.find_element_by_id("show more").click() # This is just an example case