我是网络报废的新手,我想做的是从以下网站的下拉列表中打印出所有公交路线:https://tmweb.pacebus.com/TMWebWatch/LiveDepartureTimes 我知道这是一个动态网站,所以我决定安装 selenium 并将其与 BeautifulSoup 一起使用。
以下是我尝试打印出路由下拉列表中的每个元素:
from bs4 import BeautifulSoup
from datetime import datetime
import requests
from selenium import webdriver
pace_bus_url = 'https://tmweb.pacebus.com/TMWebWatch/LiveDepartureTimes'
driver = webdriver.Chrome()
driver.get(pace_bus_url)
page_source = driver.page_source
driver.quit()
soup = BeautifulSoup(page_source, 'html.parser')
stops = soup.find_all(class_='active-result')
for stop in stops:
print(stop.text.strip())
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print(current_time)`
我还确保通过 pip 在 pycharm 终端上安装 chrome webdrivers。当我运行程序时,唯一打印的是当前时间,但下拉列表中没有任何路线。
您可以学习使用 DevTools 中的网络选项卡,它显示您的浏览器发出的所有请求。
为了加快速度,您可以“复制为提取”,这会为您提供 javascript 代码 - 但修改为 python 很容易。
在这种特殊情况下,唯一需要的标题是
content-type
.
我们使用的
routeID
和 stopID
值来自之前的 getRoutes
和 getStops
请求,您可以在屏幕截图中看到,您也可以复制它们。
import requests
r = requests.post(
url = "https://tmweb.pacebus.com/TMWebWatch/Arrivals.aspx/getStopTimes",
headers = {"content-type": "application/json;\tcharset=UTF-8"},
data = "{routeID: 293,\tdirectionID: 2,\tstopID:\t21906,\ttpID:\t0, useArrivalTimes:\tfalse}"
)
>>> r.json()
{'d': {'errorMessage': None,
'showArrivals': False,
'showStopNumber': False,
'showScheduled': True,
'showDestination': False,
'updateTime': '5:27',
'updatePeriod': 'pm',
'routeStops': [{'routeID': 293,
'stops': [{'directionID': 2,
'stopID': 21906,
'timePointID': 0,
'sameDestination': False,
'crossings': [{'cancelled': True,
'schedTime': '5:35',
'schedPeriod': 'pm',
'predTime': None,
'predPeriod': None,
'countdown': None,
'destination': None},
{'cancelled': False,
'schedTime': '5:50',
'schedPeriod': 'pm',
'predTime': '5:50',
'predPeriod': 'pm',
'countdown': None,
'destination': None},
{'cancelled': False,
'schedTime': '6:05',
'schedPeriod': 'pm',
'predTime': '6:05',
'predPeriod': 'pm',
'countdown': None,
'destination': None}]}]}]}}