python-3.x - BeautifulSoup:识别网页对象的抓取方法
问题描述
我正在尝试从 megabus 的网站上获取购票日期,这样我就知道什么时候买票了。我对 python 或 BeautifulSoup 不是很有经验,但我已经能够很好地使用一些示例代码来收集和解析列出日期的主页。当我使用 Firefox 检查页面时,我将“datepicker-available-span”标识为感兴趣的对象。但是,当我搜索下面代码的输出时,我无法找到相同的对象。
关于如何收集“截至 10 月 16 日的可用日期”作为变化变量以便我可以监控它的任何提示?我是否需要运行像 Selenium 这样的浏览器?谢谢您的帮助!
import requests
from bs4 import BeautifulSoup
# Collect and parse first page
page = requests.get('https://us.megabus.com/')
soup = BeautifulSoup(page.text, 'html.parser')
# Print Page Text
print(page.text)
解决方案
页面通过 JavaScript 动态加载数据。但是我们可以使用它requests
来获取可用的日期。此脚本将打印路线 fromAlbany, NY
到的可用日期New York, NY
:
import json
import requests
def find_id(cities, cityname):
for c in cities['cities']:
if c['name'] == cityname:
return c['id']
cities_url = 'https://us.megabus.com/journey-planner/api/origin-cities'
traveldates_url = 'https://us.megabus.com/journey-planner/api/journeys/travel-dates?originCityId={}&destinationCityId={}'
cities = requests.get(cities_url).json()
origin_id = find_id(cities, 'Albany, NY')
destination_id = find_id(cities, 'New York, NY')
traveldates = requests.get(traveldates_url.format(origin_id, destination_id)).json()
print(json.dumps(traveldates, indent=4))
印刷:
{
"errors": [],
"availableDates": [
"2019-08-17",
"2019-08-18",
"2019-08-19",
"2019-08-20",
"2019-08-21",
"2019-08-22",
"2019-08-23",
...and so on.
要获取最后日期,您可以执行以下操作:
print(max(traveldates['availableDates']))
这将打印:
2019-10-16
推荐阅读
- node.js - Microsoft Azure 自定义视觉 API nodeJS-classifyImageUrl() 错误“BadRequestImageUrl”
- ios - 在 iOS 中与朋友进行实时游戏配对
- c# - 在未知 DbSet 上调用方法“Find”会抛出:“对象与目标不匹配。”
- html - 将多个html文件合并为一个
- r - R ggplot 以网格格式绘制 geom_points
- javascript - 无法使用 $q 和 promise
- java - entityManager.persist() 在 servlet 中工作,但不在单独的类中
- laravel - Bootstrap 使用 Objects 作为标签输入的标签输入免费输入不起作用
- git - 构建服务器 git 镜像
- javascript - 多边形未绘制 // 表示变量不存在,但控制台中没有返回错误