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

Efficient web page scraping with Python/Requests/BeautifulSoup

我正在尝试从芝加哥交通管理局 bustracker 网站获取信息。特别是,我想快速输出前两辆公交车的预计到达时间。我可以使用 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')

没有成功。所有的数据字段都是空的(好吧,有  )。例如,当页面如下所示时:

当我使用 Splinter 执行类似搜索时,这段代码 s.find(id='time1').text 给了我 u'\xa0' 而不是“12 分钟”。

我不拘泥于BeautifulSoup/requests;我只想要一些不需要 Splinter/pyvirtualdisplay 开销的东西,因为该项目要求我获得一个简短的字符串列表(例如,对于上图,[['9','104th/Vincennes','1158','12 MINUTES'],['9','95th','1300','13 MINUTES']])然后退出。

坏消息

所以坏消息是您试图抓取的页面是通过 Javascript 呈现的。虽然 Splinter、Selenium、PhantomJS 等工具可以为您呈现它并为您提供易于抓取的输出,但 Python + Requests + BeautifulSoup 不会立即为您提供。

好消息

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

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

现在有了 XML 响应,它不如 JSON 好,所以我建议阅读 this answer 关于与请求库集成的内容。但它将比 Splinter 轻很多