2016-01-13 84 views
0

我已经阅读了一些相关的帖子,但无法找到答案。使用AJAX的刮脸网站

我想抓取一个网页与评论。当访问网站时,首先只有10条评论,并且用户应当按下“显示更多”以获得10条更多评论(其还将#add10添加到网站地址的末尾),每当他滚动到结束时评论列表。实际上,用户可以通过将#add1000(其中1000是额外的评论数)添加到网站地址的末尾来获得完整的评论列表。问题是,我得到使用SITE_URL#add1000我只蜘蛛前10条评论中,正如与SITE_URL所以这种方法是行不通的。

我也无法找到一种方法来制作一个适当的请求模仿网站的原点。产地AJAX URL的形式为 '域/ 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错误。任何人都可以解释我做错了什么?

回答

1

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

其中一个这样的无头浏览器是selenium

即)

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

那么,我以前使用硒+ phantomjs,但它相对较慢。你确定这不是一个更好的方法吗? –

+0

@AlexK。还有其他的方式看到这个http://stackoverflow.com/questions/16390257/scraping-ajax-pages-using-python,但我不知道导航和所有。 – Steve

+0

谢谢。我在代码中发现了一个错误 - 实际上,我错过了'x-requested-with':'XMLHttpRequest'在我的头文件中,并且noboby可能会注意到它,因为我没有提供这部分代码...既然你的答案建议另一种解决问题的恰当方法,我将其标记为解决方案。 –

1

通常,当你向下滚动页面,阿贾克斯将发送请求到服务器,然后服务器会响应JSON/XML文件恢复到您的浏览器刷新页面。

你需要找出链接到这个json/xml文件的url。通常情况下,你可以打开你的Firefox浏览器并打开工具/ web dev/web控制台。监视网络活动,你可以很容易地捕捉到这个json/xml文件。

一旦你找到这个文件,那么你可以直接解析从他们的评论(我建议Python模块请求和BS4做这项工作),并减少了大量的时间量。请记住使用一些不同的客户端和IP。对服务器很好,它不会阻止你。

+0

谢谢!你能告诉我如何组织我的计划吗? –

+0

现在很简单。脚本每天一次完整地解析网站(所有链接和页面)以获得最新评论。但我意识到这不是最好的方式:1)我得到新的评论,延迟一天; 2.)可能每次解析站点上的所有信息是不必要的。 现在我正在考虑每小时发送一次头文件请求到第一个网站的页面,只解析第一个页面,并且只有当它们被更改时。这是一个好方法吗?我的头会不会请求打扰网站太多?有更好的方法吗?谢谢! –

+0

我认为它会起作用,因为你不会发送太多请求。 –