尝试 Webscrape 动态网站以获取下拉项目

问题描述 投票:0回答:1

我是网络报废的新手,我想做的是从以下网站的下拉列表中打印出所有公交路线: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。当我运行程序时,唯一打印的是当前时间,但下拉列表中没有任何路线。

python html selenium-webdriver web-scraping beautifulsoup
1个回答
0
投票

您可以学习使用 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}]}]}]}}
© www.soinside.com 2019 - 2024. All rights reserved.