You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何抓取Google RSS Feed中的真实目标链接?

如何抓取Google RSS Feed中的真实目标链接?

我来帮你拆解这个问题,一步步解决你的困扰:

首先,先搞懂RSS里的链接是什么

你从Google RSS Feed里拿到的那些链接,并不是直接的新闻源真实链接——它们是Google的中间跳转跟踪链接,主要用来统计点击数据、做安全校验。在浏览器里点击时,浏览器会自动处理跳转逻辑(可能是通过meta标签、JS脚本或者服务器端重定向),但直接用requests请求时,因为模拟的浏览器环境不够完整,就会出现拿不到真实链接的情况。

为什么你的当前代码没得到预期结果?

你的代码只加了User-Agent,但浏览器发送的请求头远不止这一个。缺失的AcceptAccept-LanguageReferer等字段,可能让Google判断你的请求不是真实浏览器发起的,所以没有触发自动重定向,反而返回了需要JS触发跳转的页面内容。

下面给你几个可行的解决方案,按推荐程度排序:

方案1:优化请求头,触发自动重定向

补充更完整的请求头,模拟真实浏览器的请求行为,这样大概率能让Google直接返回重定向后的真实链接:

import requests
from urllib.parse import unquote

# 更完整的请求头,模拟Chrome浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 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://news.google.com/',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

# 假设你从RSS里拿到的跳转链接是google_jump_url
google_jump_url = "你从RSS获取的跳转链接"
response = requests.get(google_jump_url, headers=headers, allow_redirects=True)

# 检查是否成功重定向到真实链接
if response.history:
    print("真实链接:", response.url)
else:
    # 如果没自动重定向,就解析返回的页面内容提取真实链接
    print("未自动重定向,开始解析页面提取链接...")

方案2:解析返回页面中的跳转目标

如果方案1没触发自动重定向,返回的是带JS跳转的HTML页面,我们可以直接从页面内容里提取真实链接:

方法A:解析Meta Refresh标签

很多跳转页面会用meta refresh标签实现自动跳转,用BeautifulSoup解析:

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')
meta_refresh = soup.find('meta', attrs={'http-equiv': 'refresh'})
if meta_refresh:
    # 提取content里的url部分,格式一般是 "0;url=真实链接"
    content = meta_refresh.get('content')
    if 'url=' in content:
        real_url = content.split('url=')[1]
        # 解码URL(如果有编码的话)
        real_url = unquote(real_url)
        print("提取到的真实链接:", real_url)
方法B:解析JS跳转脚本

如果页面是用JS触发跳转的,用正则表达式提取跳转目标:

import re

# 匹配类似 window.location.href = "真实链接" 的JS代码
match = re.search(r'window\.location\.href\s*=\s*["\'](.*?)["\']', response.text)
if match:
    real_url = unquote(match.group(1))
    print("提取到的真实链接:", real_url)

方案3:用Headless浏览器模拟真实点击(终极方案)

如果上面的方法都失效(比如Google加强了反爬校验),可以用Selenium或者Playwright这类Headless浏览器工具,完全模拟浏览器的行为:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 配置Headless Chrome
chrome_options = Options()
chrome_options.add_argument('--headless=new')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36')

driver = webdriver.Chrome(options=chrome_options)
driver.get(google_jump_url)

# 等待跳转完成(可以加显式等待,更稳健)
driver.implicitly_wait(3)

# 获取当前页面的URL,就是真实链接
real_url = driver.current_url
print("真实链接:", real_url)

driver.quit()

总结最佳实践

  1. 优先用方案1,只需要补充请求头,轻量且高效;
  2. 方案1不行就用方案2,解析页面内容提取链接,比Headless浏览器更节省资源;
  3. 前两个都失效时再用方案3,虽然资源消耗大,但能应对绝大多数反爬场景。

备注:内容来源于stack exchange,提问作者Jack Holly

火山引擎 最新活动