使用requests、bs4、newspaper爬取谷歌新闻时soup.select('.r a')返回空值
问题根因
- 谷歌已更新搜索结果页面的DOM结构,你之前使用的
.r类名早已被移除,导致soup.select(".r a")无法匹配到任何链接元素 - 原代码还存在多处语法、逻辑错误,需要同步修复
修复要点
- 替换正确的DOM选择器,当前谷歌新闻搜索结果链接统一携带
jsname="UWckNb"属性,用该属性匹配更稳定 - 修复
bs4未显式导入、webbrowser拼写错误的问题 - 移除
webbrowser.open()调用,该方法返回布尔值而非URL,无法传入Article类做解析 - 新增请求头模拟浏览器访问,避免谷歌直接拦截爬虫请求
- 修正关键词拼接逻辑,移除多余的HTML实体字符
修复后完整代码
import pandas as pd import requests from bs4 import BeautifulSoup import time import newspaper from newspaper import Article # 全局存储变量 Company_name1 =[] Article_number1=[] Article_Title1=[] Article_Authors1=[] Article_pub_date1=[] Article_Text1=[] Article_Summary1=[] Article_Keywords1=[] Final_dataframe=[] # 模拟浏览器的请求头,避免被谷歌拦截 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" } class Newspapr_pd: def __init__(self,term): self.term=term self.subjectivity=0 self.sentiment=0 # 搜索URL直接拼接带引号的关键词 self.url=f'https://www.google.com/search?q="{self.term}"&safe=active&tbs=qdr:w,sdb:1&tbm=nws&source=lnt&dpr=1' def NewsArticlerun_pd(self): response=requests.get(self.url, headers=HEADERS) response.raise_for_status() soup=BeautifulSoup(response.text,'html.parser') # 替换为当前有效的选择器 links=soup.select('a[jsname="UWckNb"]') numOpen = min(5, len(links)) Article_number=0 for i in range(numOpen): # 直接获取链接,不需要打开浏览器 article_url = links[i].get("href") article = Article(article_url, language="en") Article_number+=1 print('*************************************************************************************') Article_number1.append(Article_number) Company_name1.append(self.term) try: # 下载解析文章 article.download() article.parse() article.nlp() Article_Title1.append(article.title) Article_Text1.append(article.text) Article_Authors1.append(article.authors) Article_pub_date1.append(article.publish_date) Article_Summary1.append(article.summary) Article_Keywords1.append(article.keywords) except Exception as e: print(f'页面加载失败:{str(e)}') continue # 每爬完一篇加1秒延迟,避免被封 time.sleep(1) for art_num,com_name,title,text,auth,pub_dt,summaries,keywds in zip(Article_number1,Company_name1,Article_Title1,Article_Text1,Article_Authors1,Article_pub_date1,Article_Summary1,Article_Keywords1): Final_dataframe.append({ 'Article_link_num':art_num, 'Company_name':com_name, 'Article_Title':title, 'Article_Text':text, 'Article_Author':auth, 'Article_Published_date':pub_dt, 'Article_Summary':summaries, 'Article_Keywords':keywds }) list_of_companies=['Amazon','Jetairways','nirav modi'] for i in list_of_companies: a=Newspapr_pd(i) a.NewsArticlerun_pd() # 每个关键词搜索完加2秒延迟 time.sleep(2) Final_new_dataframe=pd.DataFrame(Final_dataframe) print(Final_new_dataframe.tail())
注意事项
如果后续再次出现匹配不到链接的情况,直接打开谷歌新闻搜索页面,按F12查看搜索结果链接的最新属性,替换选择器即可。如果频繁被谷歌拦截,可以适当拉长延迟时间,或者使用代理IP池。
内容的提问来源于stack exchange,提问作者user3762120
相关产品推荐
相关产品推荐

