使用 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 轻很多。
我正在尝试从芝加哥交通管理局 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 轻很多。