脚本从众多内容中获取更少的内容

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提取哪些数据并刮取项目的信息