【问题标题】:python urllib2 - wait for page to finish loading/redirecting before scraping?python urllib2 - 在抓取之前等待页面完成加载/重定向?
【发布时间】:2012-07-12 20:27:37
【问题描述】:

我正在学习制作网络抓取工具,并想为个人项目抓取 TripAdvisor,使用 urllib2 抓取 html。 但是,我遇到了一个问题,使用下面的代码,我返回的 html 不正确,因为页面似乎需要一秒钟才能重定向(您可以通过访问 url 来验证这一点) - 相反我得到了代码从最初短暂出现的页面。

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

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

【问题讨论】:

  • urllib 不会引发错误吗?这种情况有一个重定向器......
  • @DonQuestion 没有错误,我只是从被重定向之前短暂出现的页面中获取 html。我想要最后出现的页面中的html。这个redirectdirector是什么,你能详细说明一下吗?
  • 如果你使用 urlopen,你正在使用 OpenerDirector.open() 查看 python-docs - 不幸的是它没有用 2-3 个词解释:-( : docs.python.org/library/…

标签: python urllib2


【解决方案1】:

问题不是重定向,而是页面使用 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)

【讨论】:

  • 感谢您的回答。让我尝试重申其中的一些内容:所以当您单击“豪华”或“家庭”等不同类别时,您在页面上看到的更改仅通过 javascript 生成? (即页面的代码永远不会改变?)我需要做的是找到一个可以运行 JS 然后返回该内容的工具?您推荐的最简单/最好的是什么?我觉得 api 不适合我在这种情况下尝试做的事情。
  • selenium 可能是最好的方法,它使用实际的浏览器虽然是完全自动化的,但它需要一个至少安装有虚拟帧缓冲区或桌面环境的浏览器,因为它会调用一上来……
猜你喜欢
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2019-03-17
相关资源
最近更新 更多