使用Beautiful Soup爬取Argus新闻时定位指定class容器无结果问题
问题原因分析
- 请求未模拟浏览器特征,触发网站反爬机制:该站点有基础反爬策略,直接发送无有效
User-Agent的请求会被识别为爬虫,返回的页面不包含新闻正文相关的DOM节点,自然无法匹配到article.news-container.cf元素。 - 内容为动态渲染生成:站点新闻内容大概率是通过JavaScript异步加载渲染的,
requests库只能拿到初始的静态HTML源码,此时目标节点还未被JS生成,所以匹配结果为空。 - 多类名匹配规则问题:BeautifulSoup按多类名精准匹配时,若页面类名的空格、顺序有微小差异也会导致匹配失败,不过这个问题在当前场景下优先级低于前两个。
解决方案
方案1:添加请求头尝试静态爬取
先补充完整的请求头模拟真实浏览器请求,优先尝试静态获取内容,代码修改如下:
import requests from bs4 import BeautifulSoup import urllib3 # 关闭verify=False带来的警告 urllib3.disable_warnings() url = "https://www.argusmedia.com/en/news/2214037-us-hrc-prices-rise-as-supply-remains-tight" # 模拟Chrome浏览器的请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Referer": "https://www.argusmedia.com/" } r1 = requests.get(url, headers=headers, verify=False) print(r1.status_code) coverpage = r1.content soup1 = BeautifulSoup(coverpage, "html5lib") coverpage_news = soup1.find_all('article' , class_ ='news-container cf') print(len(coverpage_news))
如果运行后匹配长度仍为0,说明内容是动态渲染的,需要使用方案2。
方案2:使用无头浏览器模拟页面加载
用Selenium等工具模拟浏览器完整加载页面,等待JS渲染完成后再提取内容,示例代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import time chrome_options = Options() # 无头模式,不弹出浏览器窗口 chrome_options.add_argument("--headless=new") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") url = "https://www.argusmedia.com/en/news/2214037-us-hrc-prices-rise-as-supply-remains-tight" driver = webdriver.Chrome(options=chrome_options) driver.get(url) # 等待3秒让页面完全渲染,也可以用显式等待定位目标元素提升效率 time.sleep(3) # 获取渲染后的完整页面源码 page_source = driver.page_source driver.quit() soup1 = BeautifulSoup(page_source, "html5lib") coverpage_news = soup1.find_all('article' , class_ ='news-container cf') print(len(coverpage_news))
拿到目标元素后就可以进一步提取标题、正文、发布日期等所需信息。
内容的提问来源于stack exchange,提问作者Saurav Sharma
相关产品推荐
相关产品推荐

