【问题标题】:Web Scraping: missing tags in requests content网页抓取:请求内容中缺少标签
【发布时间】:2020-02-28 12:15:45
【问题描述】:

我正在学习 Python,我的第一个项目是抓取戴尔网页以提取一些数据并将其存储在 Zabbix 中。

基本上,我需要提取我们拥有的一些服务器的保修信息。 这是我到目前为止得到的代码。

import requests
from bs4 import BeautifulSoup

my_url = 'https://www.dell.com/support/home/ca/en/cadhs1/product-support/servicetag/0-NE9lVXI4NlpmbjFtRHJBbTF0dDhoQT090/overview'

# UserAgent 
headers = {
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "en-GB,en-US;q=0.9,en;q=0.8,pt-BR;q=0.7,pt;q=0.6",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "cross-site",
    "Sec-Fetch-User": "?1",
    "Upgrade-Insecure-Requests": "1",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",
    "X-Amzn-Trace-Id": "Root=1-5e5752df-915a054873c751c475708940"
}

# Opening up connection to site
uClient = requests.get(my_url, headers=headers)
page_soup = BeautifulSoup(uClient.content, 'html.parser')  
print(page_soup)

有趣的是,当我检查页面时,我可以看到我想要抓取的数据,但是当我在代码中打印页面时,数据不存在。似乎提取的数据不完整。

这是我想在脚本上看到的数据<p id="warrantyExpiringLabel" class="mb-0">Expires 11 DEC. 2022</p>,但打印时它不存在。

我正在阅读一些在线论坛,说一些数据是通过 javascript 插入的,这就是 Beautifulsoup 库无法提取它的原因。我需要使用其他一些库来收集数据。

我仍在学习 Python 和 Beautifulsoup 库,因此我可能需要有人为我指明正确的方向。

谁能与我分享你的知识,以便我学习这个库?

【问题讨论】:

  • 检查我对类似问题的回答:stackoverflow.com/a/56587626/7994074。我希望这会有所帮助
  • 您尝试抓取的内容是在浏览器中使用 Javascript 动态呈现的。使用请求,您只能获得没有您提到的段落的原始 HTML。你需要使用像 Selenium 这样的东西。
  • 当您想处理基于核心 Javascript 的 Web 应用程序并希望通过 AJAX/PJAX 请求使浏览器自动化时。那么 Selenium 将是一个不错的选择。
  • 嘿@petezurich 你能告诉我你是如何知道内容是通过 Javascript 动态传递的,这样我也可以学习并避免将来出现同样的错误吗?
  • 在您的浏览器中,您可以比较原始 HTML (View Page Source) 和呈现的网页内容 (Inspect element)。前者是您可以通过请求获得的,后者是您必须通过 Selenium 获得的。

标签: python beautifulsoup python-requests


【解决方案1】:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import time

options = Options()
options.add_argument('--headless')
driver = webdriver.Firefox(options=options)
driver.get("https://www.dell.com/support/home/ca/en/cadhs1/product-support/servicetag/0-NE9lVXI4NlpmbjFtRHJBbTF0dDhoQT090/overview")

time.sleep(1)
soup = BeautifulSoup(driver.page_source, 'html.parser')

for item in soup.findAll("p", id="warrantyExpiringLabel"):
    print(item.text)

driver.quit()

输出:

Expires  20 JUL 2023

【讨论】:

  • 天啊!非常感谢您修复我的代码。我整整一个星期都在敲我的头。您甚至包括了“无头”选项,因此在代码运行时不会打开 Web 浏览器。这是完美的。我想我的错误是试图只使用 BeautifulSoup 来做到这一点,而我应该使用 selenium 来完成这项工作。你是个传奇!
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 2019-04-26
  • 2010-10-09
  • 2022-01-18
相关资源
最近更新 更多