我正在尝试对这个动态网站进行网络抓取,以获取学期内提供的课程名称和授课时间:https://www.utsc.utoronto.ca/registrar/timetable
问题是,当你第一次进入网站时,还没有显示任何课程,只有在选择";会话";并点击";搜索课程";课程会开始出现吗。
这是问题的开始:
- 我做不到
html = urlopen(url).read()
使用urlib.request,因为它只会在没有任何内容的情况下显示页面的HTML。
- 我快速搜索了如何浏览动态网站,并运行了这样的代码:
import requests
url = 'https://www.utsc.utoronto.ca/registrar/timetable'
r= requests.get(url)
data = r.json()
print(data)
然而,当我运行这个时,它返回"0";JSONDecodeError:应为值";当它在其他动态网站上运行时,我不知道为什么会发生这种情况。
我真的不必使用硒或美丽汤,所以如果有更好的替代品,我会很乐意尝试。我还想知道什么时候:
html = urlopen(url).read()
返回的html的格式是什么?我想知道我是否可以在选择会话并单击搜索后,从检查网站中复制更改后的HTML。
您可以使用此代码来获取所需的数据:
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)
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((返回的值创建一个Beutilous Soup,看看是否可以在那里操作数据。