簡體   English   中英

使用 Selenium 或 Beautiful Soup 抓取動態網站

[英]Scraping a Dynamic Website using Selenium or Beautiful Soup

我正在嘗試 web 抓取此動態網站以獲取學期期間提供的課程名稱和講座時間: 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)

但是,當我運行它時,它會返回“JSONDecodeError: Expecting value”,我不知道為什么它在其他動態網站上工作時會發生這種情況。

我真的不必使用 Selenium 或 Beautiful Soup,所以如果有更好的選擇,我很樂意嘗試。 我也想知道什么時候:

html = urlopen(url).read()

返回的 html 的格式是什么? 我想知道我是否可以在選擇會話並單擊搜索后通過檢查網站復制更改的 HTML。

ps:這是我第一次在stackoverflow中使用詢問,所以如果我的問題不夠清楚等,請告訴我。對不起,提前謝謝!

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM