rob*_*txt 6 python web-scraping python-3.x
我正在尝试从网页中获得不同的大学名称及其排名。我尝试过的脚本可以解析前几个名称及其排名。
但是,该页面中有233个名称及其排名,但是只有当该页面向下滚动时,它们才可见。问题是当页面向下滚动时,URL仍然相同,因此我无法创建任何处理分页的逻辑。
我不希望硒,这就是我创建此帖子以使用请求解决相同问题的原因。
到目前为止,我已经写过(抢了前几条记录):
import requests
from bs4 import BeautifulSoup
url = 'https://www.usnews.com/best-colleges/rankings/national-liberal-arts-colleges'
r = requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
soup = BeautifulSoup(r.text,"lxml")
for item in soup.select("[id^='school-']"):
name = item.select_one("[class^='DetailCardColleges__StyledAnchor']").text
rank = item.select_one("[class^='ranklist-ranked-item'] > strong").text
print(name,rank)
Run Code Online (Sandbox Code Playgroud)
如何使用请求解析所有名称及其排名?
Tar*_*ani 10
对您来说好事是,此页面使用JSON API进行分页,因此您甚至不需要使用bs4,只需对请求本身进行操作即可
import requests
url_template = 'https://www.usnews.com/best-colleges/api/search?_sort=rank&_sortDirection=asc&_page={page}&schoolType=national-liberal-arts-colleges'
headers = {
'pragma': 'no-cache',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
'accept': '*/*',
'cache-control': 'no-cache',
'authority': 'www.usnews.com',
'referer': 'https://www.usnews.com/'
}
def scrape_data(data):
print(data)
data = requests.get(url_template.format(page=1), headers=headers).json()
scrape_data(data)
total_pages = data["data"]["totalPages"]
for i in range(2, total_pages + 1):
data = requests.get(url_template.format(page=i), headers=headers).json()
scrape_data(data)
Run Code Online (Sandbox Code Playgroud)
在scrape_data我刚刚打印的整个数据中,但是您可以更改要从该JSON提取哪些数据并刮取项目的信息
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |