首页 > 解决方案 > 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)

标签: python-3.xbeautifulsoup

解决方案


页面通过 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

推荐阅读