使用 Selenium 或 Beautiful Soup 抓取动态网站

Scraping a Dynamic Website using Selenium or Beautiful Soup

我正在尝试通过网络抓取这个动态网站以获取学期中提供的课程名称和授课时间:https://www.utsc.utoronto.ca/registrar/timetable

问题是第一次进入网站时还没有显示课程,只有在选择“Session(s)”并点击“Search for Courses”后才会显示课程。

这里是问题开始的地方:

  1. 我做不到
html = urlopen(url).read()

使用urllib.request,因为它只会在没有任何内容时显示页面的HTML。

  1. 我快速搜索了如何对动态网站进行网络抓取,运行 通过这样的代码:
import requests
url = 'https://www.utsc.utoronto.ca/registrar/timetable'

r= requests.get(url)
data = r.json()
print(data)

然而,当我 运行 这个 returns “JSONDecodeError: Expecting value” 并且我不知道为什么当它在其他动态网站上工作时会出现这种情况。

我真的不必使用 Selenium 或 Beautiful Soup,所以如果有更好的选择,我会很乐意尝试。我也想知道什么时候:

html = urlopen(url).read()

返回的 html 是什么格式?我想知道是否可以在选择会话并单击搜索后通过检查网站复制更改的 HTML。

def render_page(url):
    driver = webdriver.Chrome(PATH)
    driver.get(url)
    r = driver.page_source
    driver.quit()
    return r

#render page using chrome driver and get all the html code on that certain webpage

def create_soup(html_text):
    soup = BeautifulSoup(html_text, 'lxml')
    return soup

如果内容是动态加载的,您将需要为此使用 selenium。使用 render_page() 的返回值创建一个 Beutiful Soup,看看您是否可以在那里操作数据。

您可以使用此代码获取您需要的数据:

import requests

url = "https://www.utsc.utoronto.ca/regoffice/timetable/view/api.php"

# for winter session
payload = "coursecode=&sessions%5B%5D=20219&instructor=&courseTitle="

headers = {
  'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)