2012-07-12 53 views
8

我正在学习制作网页抓取工具,并希望抓取TripAdvisor的个人项目,并使用urllib2抓取html。 但是,我遇到了一个问题,使用下面的代码,我得到的html不正确,因为页面似乎需要一秒钟重定向(您可以通过访问url来验证) - 取而代之的是,代码来自最初短暂出现的页面。python urllib2 - 等待页面在抓取前完成加载/重定向?

是否有一些行为或参数要设置,以确保页面在获取网站内容之前完全加载/重定向?

import urllib2 
from bs4 import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
print soup.prettify() 

编辑:答案是彻底的,但是,在什么解决我的问题是这样的结尾: https://stackoverflow.com/a/3210737/1157283

+0

犯规的urllib引发错误?有这种情况下的redirectdirector ... – 2012-07-12 20:50:54

+0

@DonQuestion没有错误,我只是从被重定向之前短暂出现的页面获取html。我想从最后出现的页面获得html。这个redirectdirector是什么,你可以详细说明一下吗? – Ken 2012-07-12 20:55:26

+0

如果你使用urlopen,你正在使用OpenerDirector.open()看​​看python-docs - 不幸的是它没有在2-3个字中解释:-(:http://docs.python.org/library/urllib2.html? highlight = urllib2#urllib2.OpenerDirector – 2012-07-12 21:08:53

回答

5

Inreresting问题是不是一个重定向是网页修改使用JavaScript的内容,但urllib2没有JS引擎,它只是GETS数据,如果您在您的浏览器禁用了JavaScript,你会注意到它基本上加载同样内容的urllib2回报

import urllib2 
from BeautifulSoup import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
open('test.html', 'w').write(soup.read()) 

test.html并在浏览器中禁用JS,在Firefox中最容易 - >取消选中启用JavaScript,生成相同的结果集。

因此,我们有什么可以做的很好,我们首先应该检查是否该网站提供的API,报废趋于皱眉了 http://www.tripadvisor.com/help/what_type_of_tripadvisor_content_is_available

Travel/Hotel API's? 看起来搞不好,虽然有一些限制。

但是如果我们仍然需要刮掉它,用JS,那么我们可以使用它主要用于测试的seleniumhttp://seleniumhq.org/,但它的易用性和相当好的文档。

我也发现了这个Scraping websites with Javascript enabled?http://grep.codeconsult.ch/2007/02/24/crowbar-scrape-javascript-generated-pages-via-gecko-and-rest/

希望帮助。

补充说明:

>>> import urllib2 
>>> from bs4 import BeautifulSoup 
>>> 
>>> bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
>>> value = bostonPage.read() 
>>> soup = BeautifulSoup(value) 
>>> open('test.html', 'w').write(value) 
+0

感谢您的回答,让我试着重申一下:所以当您点击“豪华”或“家庭”等不同类别时,您在页面上看到的更改仅通过javascript?(即页面的代码永远不会改变?)我需要做的是找到一个工具来运行JS,然后返回这些内容?什么是最简单/最好的建议?我觉得api是 – Ken 2012-07-12 21:16:49

+0

selenium可能是实现这一目标的最佳方式,它使用实际的浏览器,尽管它是全自动的,但是因为它需要一个至少安装了虚拟帧缓冲区或浏览器的浏览器桌面环境,因为它会调用一个... – 2012-07-12 21:26:51