我正在学习制作网页抓取工具,并希望利用TripAdvisor搜索个人项目,使用urllib2抓取html。 但是,我遇到了一个问题,使用下面的代码,我回来的html是不正确的,因为页面似乎需要一秒钟重定向(你可以通过访问网址验证这一点) - 而是我得到的代码来自最初短暂出现的页面。
是否有一些行为或参数需要设置以确保页面在获取网站内容之前已完全加载/重定向?
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 :(得分:6)
问题的重新定位不是重定向是该页面使用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,那么我们可以使用它主要用于测试的selenium
http://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)