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

Colab中用BeautifulSoup遇ReCaptcha,本地正常的问题咨询

解决Colab中网页抓取触发ReCaptcha的问题

这问题我之前帮朋友排查过类似的,核心原因是Colab的服务器IP被目标网站的反爬系统标记为高风险源了:

  • 本地运行时,你的IP属于普通家用/办公IP池,是网站认定的「正常用户」IP,所以不会触发验证;
  • 但Colab的IP来自谷歌云的服务器集群,大量用户用它做批量爬虫请求,网站的反爬系统会把这类IP直接归类为「可疑爬虫」,触发ReCaptcha或返回403。

下面是几个可行的解决方案,你可以根据情况选择,而且都能适配Colab的一键运行需求:

1. 丰富请求头,模拟真实浏览器行为

你现在只设置了User-Agent,可以补充更多浏览器请求头,让请求看起来更像真实用户访问。修改后的headers示例:

headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 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.target-website.com/',  # 替换成目标网站的首页URL
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

如果还是不行,可以尝试随机切换不同的User-Agent(比如从常见浏览器UA列表里随机选),避免固定UA被识别。

2. 使用 Residential 代理IP

既然Colab的IP本身被拉黑,换一个属于普通用户的IP就能绕过限制。推荐使用付费的residential代理(这类IP是真实用户的家用IP,反爬系统很难识别),修改请求代码如下:

# 替换成你的代理地址
proxies = {
    'http': 'http://your-residential-proxy:port',
    'https': 'https://your-residential-proxy:port'
}

# 在请求时加入代理参数
query = requests.get(target_url, headers=headers, proxies=proxies).text

如果要让其他用户方便使用,可以在Colab里加一个输入框,让用户填入自己的代理信息。

3. 用Selenium模拟真实浏览器访问

静态请求如果还是被拦,就用Selenium启动真实浏览器模拟用户操作,Colab里需要先配置虚拟环境,步骤如下:

首先在Colab的代码单元格里安装依赖:

!apt-get update
!apt install chromium-chromedriver
!pip install selenium

然后修改你的抓取脚本:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import random
from tqdm import tqdm
import pandas as pd

def stock_checker(listofurls):
    chrome_options = Options()
    chrome_options.add_argument('--headless')  # 无头模式,不显示浏览器窗口
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36')
    
    driver = webdriver.Chrome('chromedriver', options=chrome_options)
    
    stock_level = []
    for target_url in tqdm(listofurls):
        print(target_url)
        driver.get(target_url)
        # 随机延迟1-3秒,模拟用户浏览间隔
        time.sleep(random.uniform(1, 3))
        
        try:
            # 定位目标div元素
            soup_result = driver.find_element(By.CLASS_NAME, 'product-details__options-basket').text
            stock_bool = "Out of Stock" if "Out of Stock" in soup_result else "In Stock"
        except Exception as e:
            # 处理拦截或元素不存在的情况
            stock_bool = "Check Failed (Possible Captcha/Block)"
        
        stock_level.append(stock_bool)
    
    driver.quit()
    return pd.DataFrame({"URls" : listofurls, "In Stock" : stock_level})

# 调用函数
print(stock_checker(myurllist))

这种方法模拟真实用户的访问流程,绕过静态请求的反爬限制,适合大多数情况。

4. 降低请求频率

批量请求时,Colab的执行速度很快,容易被网站识别为爬虫。可以在循环中加入随机延迟,比如:

import random
# 在每个请求后加入随机延迟
time.sleep(random.uniform(1, 4))

模拟用户逐个浏览页面的行为,减少被拦截的概率。

内容的提问来源于stack exchange,提问作者Jesse Murrell

火山引擎 最新活动