如何获取更多Google News中2022年苹果相关新闻(突破当前234条,目标400条)
如何获取更多Google News中2022年苹果相关新闻(突破当前234条,目标400条)
嘿,我来给你几个实用的思路,帮你突破当前的结果限制,拿到更多目标新闻:
1. 优化现有GoogleNews库的使用策略
你当前的代码只搜了单一关键词“Apple”,可以试试扩展关键词范围,加上和苹果相关的细分主题,同时调整分页范围,这样能覆盖更多不同角度的新闻:
from GoogleNews import GoogleNews import pandas as pd # 定义多个苹果相关的细分关键词,覆盖不同场景 keywords = ['Apple', 'Apple iPhone 2022', 'Apple earnings 2022', 'Apple product launch 2022', 'Apple company news 2022'] all_results = [] for keyword in keywords: # 每个关键词重新初始化GoogleNews实例,避免缓存干扰 googlenews = GoogleNews(start='01/01/2022', end='31/12/2022', lang='en', region='US') googlenews.search(keyword) # 尝试抓取更多页面(比如从2到60页,比你之前的50页多一些) for page_num in range(2, 61): googlenews.getpage(page_num) # 把当前关键词的结果加入总列表 all_results.extend(googlenews.result()) # 合并结果并去重,保留最新的条目 df = pd.DataFrame(all_results) df = df.drop_duplicates(subset=['title'], keep='last') df.reset_index(drop=True, inplace=True) print(f"最终获取到 {len(df)} 条去重后的新闻")
这个方法的核心是通过关键词拆分扩大搜索覆盖范围,同时适当增加分页的上限,通常能拿到更多结果。
2. 改用Google官方的自定义搜索API
Google Cloud提供的自定义搜索API(包含新闻搜索能力)的结果限制比第三方库宽松很多,只要你有API密钥和自定义搜索引擎ID,就能批量获取更多结果。你可以把2022年拆分成更小的时间区间(比如按季度或月份),分批次搜索后合并:
import requests import pandas as pd import time # 替换成你自己的API密钥和搜索引擎ID API_KEY = "你的Google Cloud API密钥" SEARCH_ENGINE_ID = "你的自定义搜索引擎ID" keywords = ['Apple'] all_articles = [] # 把2022年拆分成12个月份的区间,分批次搜索 month_ranges = [ ('2022-01-01', '2022-01-31'), ('2022-02-01', '2022-02-28'), ('2022-03-01', '2022-03-31'), ('2022-04-01', '2022-04-30'), ('2022-05-01', '2022-05-31'), ('2022-06-01', '2022-06-30'), ('2022-07-01', '2022-07-31'), ('2022-08-01', '2022-08-31'), ('2022-09-01', '2022-09-30'), ('2022-10-01', '2022-10-31'), ('2022-11-01', '2022-11-30'), ('2022-12-01', '2022-12-31') ] for keyword in keywords: for start_date, end_date in month_ranges: page = 1 # 每个时间区间最多抓取10页(每页10条,共100条,可根据配额调整) while page <= 10: # 构造请求URL,指定新闻类型和时间范围 url = ( f"https://www.googleapis.com/customsearch/v1?" f"q={keyword}&cx={SEARCH_ENGINE_ID}&key={API_KEY}" f"&sort=date:r:{start_date}:{end_date}&num=10&start={(page-1)*10 + 1}" f"&siteSearch=news.google.com&siteSearchFilter=i" ) response = requests.get(url) data = response.json() if 'items' in data: all_articles.extend(data['items']) page += 1 # 加个小延迟,避免触发频率限制 time.sleep(1) # 提取标题并去重 df = pd.DataFrame(all_articles) df = df.drop_duplicates(subset=['title'], keep='last') print(f"最终获取到 {len(df)} 条新闻")
要注意的是,这个API有免费配额,超出后需要付费,不过对于400条的需求来说,免费配额应该足够。
3. 网页抓取(需注意合规性)
如果上面的方法还不够,你可以模拟浏览器访问Google News网页端,通过BeautifulSoup来抓取内容。这种方法能拿到网页端能看到的所有结果,但要注意遵守Google的服务条款,不要频繁请求避免IP被封:
import requests from bs4 import BeautifulSoup import pandas as pd import time # 设置浏览器请求头,模拟真实用户访问 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' } # 初始搜索链接,指定关键词和2022年时间范围 base_url = "https://news.google.com/search?q=Apple%20when%3A2022-01-01..2022-12-31&hl=en-US&gl=US&ceid=US%3Aen" all_titles = [] current_url = base_url # 循环抓取直到拿到400条或没有下一页 while current_url and len(all_titles) < 400: response = requests.get(current_url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 提取所有新闻标题 title_elements = soup.find_all('h3', class_='ipQwMb ekueJc RD0gLb') for elem in title_elements: title = elem.get_text(strip=True) all_titles.append(title) # 找到下一页的链接 next_page_link = soup.find('a', class_='pnNext') if next_page_link: current_url = f"https://news.google.com{next_page_link['href']}" else: break # 设置2秒延迟,避免被反爬机制拦截 time.sleep(2) # 去重并转换为DataFrame unique_titles = list(set(all_titles)) df = pd.DataFrame({'title': unique_titles}) print(f"最终获取到 {len(df)} 条去重后的新闻")
这个方法的关键是模拟真实用户的访问行为,不要太激进,否则可能被Google暂时封禁IP。
备注:内容来源于stack exchange,提问作者Rolando
相关产品推荐
相关产品推荐

