脚本从许多内容中获取较少的内容

2024-05-29 10:56:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个网页上得到不同的大学名称和排名。我尝试过的脚本可以解析前几个名字及其相应的排名。在

然而,该页面中有233个名字和他们的排名,但只有当页面向下滚动时,才能看到他们。问题是当页面向下滚动时,url仍然是相同的,因此我不能创建任何逻辑来处理分页。在

Website address

我不希望使用selenium,这就是我创建这篇文章来解决相同的使用请求的原因。在

到目前为止,我已经写了(抓取了前几个记录):

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)

如何使用请求解析所有的名字及其排名?


Tags: textnameimporturl页面item名字requests
1条回答
网友
1楼 · 发布于 2024-05-29 10:56:36

对您来说,好的一面是这个页面使用了jsonapi进行分页,所以您甚至不需要使用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)

scrape_data中,我刚刚打印了整个数据,但是您可以更改要从该JSON中提取哪些数据并刮取这些项

相关问题 更多 >

    热门问题