【问题标题】:Web-Scraping using "requests" does not scrape the names/leaves out important information使用“请求”进行网络抓取不会抓取名称/遗漏重要信息
【发布时间】:2022-11-28 09:39:44
【问题描述】:

我尝试按照 this 方法来抓取这个 specific website containing names I am interested in. 的名称:

import requests

URL = "https://bair.berkeley.edu/students.html"
page = requests.get(URL)

print(page.text)

执行时,我只会得到:

  1. 在我的打印输出中该网站上列出的第一个人

  2. 当我在 Chrome 中检查它时,它显示为 <span class="name">Elaine Angelino</span>。然而,打印的 page.text 仅显示为 <span class="name"></span>

    我怎样才能解决这个问题并获得所有 ~500 名学生和他们的名字?任何帮助表示赞赏!

    我试图找到以另一种方式提取 html 的方法,但到目前为止没有成功。

【问题讨论】:

  • 我猜内容是由 JavaScript 动态生成的。您可以 1) 在浏览器中下载 html,另存为文件并从那里读取 2) 您尝试在浏览器中读取网络请求以查看数据是否作为简单的 JSON 对象被请求 3) 您可以使用 Selenium而不是请求。
  • 正如@JohnnyJohnBoy 所说,据我所知,内容是使用 firebase 动态生成的 - 因此,您可能无法从日志中找到任何方便的 API 请求并尝试复制。如果您愿意尝试使用 Selenium,可以使用 this function 进行 selenium+bs4 抓取 [对于您的情况,您只需要将其命名为 soup = linkToSoup_selenium(URL, ecx='//span[@class="name"]') 即可在解析之前加载所有名称]

标签: python html web-scraping beautifulsoup python-requests


【解决方案1】:

由于网页的名称列表由JavaScript填充,因此您可以将selenium与bs4一起使用。

from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time

webdriver_service = Service("./chromedriver") #Your chromedriver path
driver = webdriver.Chrome(service=webdriver_service)

driver.get('https://bair.berkeley.edu/students.html')
driver.maximize_window()
time.sleep(5)

soup = BeautifulSoup(driver.page_source,"lxml")
name_lst = []

for n in soup.select('.name'):
    name = n.get_text(strip=True) if n else None
    name_lst.append({'NAME':name})

df = pd.DataFrame(name_lst)
print(df)

输出:

                NAME
0
1    Yasin Abbasi-Yadkori
2          Pulkit Agrawal
3         Elaine Angelino
4           Khalid Ashraf
..                    ...
624        Rein Houthooft
625            Yanyan Lan
626    Erikson Nascimento
627      Tim G. J. Rudner
628      Markus Wulfmeier

[629 rows x 1 columns]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多