使用Python/Requests/BeautifulSoup进行高效的网页抓取

bob*_*ist 3 python beautifulsoup web-scraping python-2.7 splinter

我正试图从芝加哥运输管理局的bustracker网站上获取信息.特别是,我想快速输出前两辆巴士的到达ETA.我可以用Splinter轻松地做到这一点; 但是我在无头Raspberry Pi模型B和Splinter加上pyvirtualdisplay上运行这个脚本会导致大量的开销.

有点像

from bs4 import BeautifulSoup
import requests

url = 'http://www.ctabustracker.com/bustime/eta/eta.jsp?id=15475'
r = requests.get(url)
s = BeautifulSoup(r.text,'html.parser')
Run Code Online (Sandbox Code Playgroud)

没有办法.所有数据字段都是空的(好吧,有 ).例如,当页面如下所示:

在此输入图像描述

当我使用Splinter执行类似搜索时,此代码段s.find(id='time1').text为我提供u'\xa0'了"12分钟"而不是"12分钟".

我没有和BeautifulSoup /请求结合; 我只想要一些不需要Splinter/pyvirtualdisplay开销的东西,因为项目要求我获得一个简短的字符串列表(例如上面的图像[['9','104th/Vincennes','1158','12 MINUTES'],['9','95th','1300','13 MINUTES']]),然后退出.

Ewa*_*wan 10

坏消息

所以坏消息是你试图通过Javascript渲染的页面.虽然像Splinter,Selenium,PhantomJS这样的工具可以为你渲染这些并为你提供轻松抓取的输出,但是Python + Requests + BeautifulSoup并没有提供开箱即用的功能.

好消息

从Javascript中提取的数据必须来自某个地方,通常这将以更容易解析的格式(因为它被设计为由机器读取).

在这种情况下,您的示例加载此XML.

现在有了XML响应,它不如JSON那么好,所以我建议阅读有关与请求库集成的答案.但是,这将是一个很多超过分裂轻巧.