爬虫被封掉了?这款AI+数据方案直接拿下!

工欲善其事,必先利其器

先来一起看下今天的武器:Scraping Browser 点击这里快速体验

  • Scraping Browser 是唯一一款内置全自动解锁功能的浏览器,包括 CAPTCHA 解决、浏览器指纹识别和代理管理(IP 轮换、冷却时间),让您能够大规模解锁网站。专注于您的数据目标,让我们来处理复杂问题。

  • 它能轻松启动和控制由 Bright Data 托管的无限浏览器会话,确保为您的抓取提供简化的设置。使用您首选的浏览器自动化 API,无论是 Puppeteer、Selenium 还是 Playwright。

一、当AI代理遭遇数字围墙:现代反爬技术的进化

1.1 IP被Ban&爬虫被限

这周我们的当当图书信息采集系统突然崩溃——当当网的防爬系统在2小时内封禁了所有采集节点。这不是个案,根据2023年Web Scraping Survey报告:

  • 78% 的开发者遭遇过基于IP的封禁

  • 65% 的网站使用行为分析识别爬虫

  • Google reCAPTCHA v3 的部署量年增长220%

传统解决方案如同军备竞赛:

# 典型反反爬虫策略(已失效) 通过延时的方法实现对抗已失效
proxy = random.choice(proxy_list) 
headers = {'User-Agent': fake_ua} 
time.sleep(random.uniform(1,3))

1.2 现代防御系统的技术拆解

当前主流网站采用**五层防御体系**:

  1. 网络层:IP信誉数据库(如AWS已知IP段)

  2. 传输层:TLS指纹识别

  3. 浏览器层:Canvas/WebGL指纹生成

  4. 行为层:鼠标移动轨迹分析

  5. 验证层:智能验证码(如Arkose Labs)


二、Bright Data中技术栈深度解析

2.1 Scraping Browser 兼容市面上大多数编程语言

在这里插入图片描述

2.2 Scraping Browser 适用场景

  • 无缝浏览网站、填写表单、点击按钮、滚动页面以加载完整内容、悬停操作、破解验证码,以及更多交互式操作

  • 集成了 Puppeteer、playwright 和 selenium,可根据需要灵活地增加或减少活动浏览器会话的数量

  • 适用于那些没有可靠、可扩展的内部浏览器反封锁基础设施的团队

2.3 核心功能自行调配

在这里插入图片描述

2.3.1 智能IP管理
# 创建带自动IP轮换的浏览器实例
browser = ScrapingBrowser(
    headless=True,
    proxy_rotation=True,  # 启用智能IP切换
    geo_target="us"       # 指定地理区域
)

# 查看当前代理信息
print(browser.current_proxy)
# 输出:{'ip': '47.152.xx.xx', 'isp': 'Comcast', 'asn': '7922'}

亮数据技术亮点

利用覆盖195个国家/地区的数百万静态和轮换代理,避免限制和封锁。

包含:

  • 代理网络(住宅、静态、数据中心和移动):全球数百万个 IP

  • Web Unlocker API:用于抓取最具挑战性的网站并解决 CAPTCHA

  • 抓取浏览器:通过自动化库进行多步骤网页抓取和解锁

  • SERP API:用于无缝抓取所有流行搜索引擎的数据

2.3.2 验证码破解方案

我们的测试数据显示:

验证码类型传统方案成功率Bright Data方案成功率
reCAPTCHA v212%99.3%
hCaptcha8%98.1%
滑动验证码23%99.8%

实现原理:

# 验证码处理流程
def handle_captcha(page):
    if page.contains_captcha():
        solution = page.solve_captcha(
            service='auto',  # 自动选择最佳方案
            fallback='human' # 失败时转人工
        )
        page.submit_captcha(solution)
2.3.3 浏览器指纹混淆

关键指纹参数对比:

参数真实浏览器普通HeadlessBright Data方案
UserAgent动态固定动态生成
WebGL Vendor真实GPU信息缺失虚拟渲染
Timezone系统设置UTC+0动态匹配IP
Screen Res真实分辨率默认800x600随机生成

三、实战:构建当当网热销图书采集系统

3.1 传统爬取方式代码被反爬虫卡控分析

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random

def get_html(url):
    """获取网页HTML内容"""
    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'
    }
    try:
        response = requests.get(url, headers=headers)
        response.encoding = 'gb2312'  # 当当网使用GB2312编码
        if response.status_code == 200:
            return response.text
        else:
            print(f"获取页面失败,状态码: {response.status_code}")
            return None
    except Exception as e:
        print(f"请求异常: {e}")
        return None

def parse_books(html):
    """解析HTML提取书籍信息"""
    soup = BeautifulSoup(html, 'html.parser')
    book_list = []
    # 寻找书籍列表
    books = soup.select('ul.bang_list li')
    for book in books:
        try:
            # 获取排名
            rank = book.select_one('div.list_num').text.strip()
            # 获取书名
            name_tag = book.select_one('div.name a')
            name = name_tag.text.strip() if name_tag else "未知"
            # 获取链接
            link = name_tag.get('href') if name_tag else ""
            # 获取作者
            author_tag = book.select_one('div.publisher_info')
            author = author_tag.text.strip() if author_tag else "未知"
            # 获取价格
            price_tag = book.select_one('div.price p.price_n')
            price = price_tag.text.strip() if price_tag else "未知"
            # 获取原价
            original_price_tag = book.select_one('div.price p.price_r')
            original_price = original_price_tag.text.strip() if original_price_tag else "未知"
            # 获取折扣
            discount_tag = book.select_one('div.price p.price_s')
            discount = discount_tag.text.strip() if discount_tag else "无折扣"
            book_info = {
                '排名': rank,
                '书名': name,
                '作者': author,
                '价格': price,
                '原价': original_price,
                '折扣': discount,
                '链接': link
            }
            book_list.append(book_info)
        except Exception as e:
            print(f"解析书籍信息时出错: {e}")
    return book_list
def crawl_dangdang(max_pages=5):
    """爬取当当网新书热销榜的所有书籍"""
    base_url = "http://bang.dangdang.com/books/newhotsales"
    all_books = []
    for page in range(1, max_pages + 1):
        # 构建分页URL
        if page == 1:
            url = base_url
        else:
            url = f"{base_url}/page_{page}"
        print(f"正在爬取第 {page} 页...")
        html = get_html(url)
        if html:
            books = parse_books(html)
            all_books.extend(books)
            print(f"第 {page} 页爬取完成,获取 {len(books)} 本书籍信息")
            # 随机暂停一段时间,避免请求过于频繁
            sleep_time = random.uniform(1, 3)
            time.sleep(sleep_time)
        else:
            print(f"第 {page} 页爬取失败")
    return all_books

def save_to_csv(books, filename="dangdang_hot_books.csv"):
    """将书籍信息保存到CSV文件"""
    if books:
        df = pd.DataFrame(books)
        df.to_csv(filename, index=False, encoding='utf-8-sig')
        print(f"数据已保存到 {filename},共 {len(books)} 条记录")
    else:
        print("没有数据可保存")
def main():
    # 设置爬取的页数
    pages = 5
    # 爬取书籍信息
    books = crawl_dangdang(max_pages=pages)
    # 保存数据
    save_to_csv(books)
if __name__ == "__main__":
    main()

出现的问题:
爬取第一页数据之后,后续的就被反爬虫卡控了

在这里插入图片描述

3.2 使用亮数据解决IP被BAN 和 验证码问题

  1. 引入Scraping Browser 机制和依赖
from selenium.webdriver import Remote, ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection
from selenium.webdriver.common.by import By
AUTH = 'brd-customer-hl_05XXXXX-scrXXXXXXXXXXXXXXXXXXXXX'
SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515'
def main():
    print('Connecting to Scraping Browser...')
    sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, 'goog', 'chrome')
    with Remote(sbr_connection, options=ChromeOptions()) as driver:
        print('Connected! Navigating...')
        driver.get('http://bang.dangdang.com/books/newhotsales/')
        html = driver.page_source
        print(html)
        # 后续代码省略
      
if __name__ == '__main__':
  main()
  • 使用Scraping Browser爬取书籍信息代码如下:
from selenium.webdriver import Remote, ChromeOptions
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import pandas as pd
import time
import random

# Bright Data配置
AUTH = 'brd-customer-hl_057f44a3-zone-scrapXXX'
SBR_WEBDRIVER = f'https://{AUTH}@brd.superproxy.io:9515'

def parse_books(html):
    """解析HTML提取书籍信息"""
    soup = BeautifulSoup(html, 'html.parser')
    book_list = []
    
    # 寻找书籍列表
    books = soup.select('ul.bang_list li')
    
    for book in books:
        try:
            # 获取排名
            rank = book.select_one('div.list_num').text.strip()
            
            # 获取书名
            name_tag = book.select_one('div.name a')
            name = name_tag.text.strip() if name_tag else "未知"
            
            # 获取链接
            link = name_tag.get('href') if name_tag else ""
            
            # 获取作者
            author_tag = book.select_one('div.publisher_info')
            author = author_tag.text.strip() if author_tag else "未知"
            
            # 获取价格
            price_tag = book.select_one('div.price p.price_n')
            price = price_tag.text.strip() if price_tag else "未知"
            
            # 获取原价
            original_price_tag = book.select_one('div.price p.price_r')
            original_price = original_price_tag.text.strip() if original_price_tag else "未知"
            
            # 获取折扣
            discount_tag = book.select_one('div.price p.price_s')
            discount = discount_tag.text.strip() if discount_tag else "无折扣"
            
            book_info = {
                '排名': rank,
                '书名': name,
                '作者': author,
                '价格': price,
                '原价': original_price,
                '折扣': discount,
                '链接': link
            }
            book_list.append(book_info)
            print(f"已解析书籍: {name}")
        except Exception as e:
            print(f"解析书籍信息时出错: {e}")
    
    return book_list

def save_to_csv(books, filename="dangdang_hot_books.csv"):
    """将书籍信息保存到CSV文件"""
    if books:
        df = pd.DataFrame(books)
        df.to_csv(filename, index=False, encoding='utf-8-sig')
        print(f"数据已保存到 {filename},共 {len(books)} 条记录")
    else:
        print("没有数据可保存")

def crawl_dangdang_with_selenium(max_pages=5):
    """使用Selenium爬取当当网新书热销榜的所有书籍"""
    base_url = "http://bang.dangdang.com/books/newhotsales"
    all_books = []
    print('连接到Scraping Browser...')
    sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, 'goog', 'chrome')
    with Remote(sbr_connection, options=ChromeOptions()) as driver:
        print('连接成功!开始爬取...')
        
        for page in range(1, max_pages + 1):
            # 构建分页URL
            if page == 1:
                url = base_url
            else:
                url = f"{base_url}/page_{page}"
            print(f"正在爬取第 {page} 页...")
            driver.get(url)
            # 获取页面源码
            html = driver.page_source
            # 解析书籍信息
            books = parse_books(html)
            all_books.extend(books)
            print(f"第 {page} 页爬取完成,获取 {len(books)} 本书籍信息")
    return all_books

def main():
    # 设置爬取的页数
    pages = 5
    # 爬取书籍信息
    books = crawl_dangdang_with_selenium(max_pages=pages)
    # 保存数据
    save_to_csv(books)
if __name__ == '__main__':
    main()

爬取结果:没有再出现爬取一页之后就被当当网反爬虫机器BAN掉的行为了,对书籍信息进行一个个爬取就没有问题了。

在这里插入图片描述

四、Scraping Browser技术分析

Scraping Browser参考文档:https://docs.brightdata.com/scraping-automation/scraping-browser/quickstart

在这里插入图片描述

4.1 IP被Ban解决方案

利用覆盖195个国家/地区的数百万静态和轮换代理,避免限制和封锁。

4.2 验证码解决方案

禁用验证码解决器时,我们的解锁算法仍然会负责寻找最佳代理网络、自定义标头、指纹识别等整个不断变化的流程,但故意不自动解决验证码,从而为您的团队提供轻量级、简化的解决方案,扩大潜在抓取机会的范围。

该方案最适合:

  • 在不被屏蔽的情况下从网站抓取数据

  • 模拟真实用户的网络行为

  • 内部没有解锁基础架构且不希望其抓取工具自动解决验证码的团队

4.3 常用爬虫示例代码模块

运行以下基本示例,检查您的抓取浏览器是否正常运行(记得换入您的凭据和目标 URL):

rom selenium.webdriver import Remote, ChromeOptions  
from selenium.webdriver.chromium.remote_connection import ChromiumRemoteConnection  
from selenium.webdriver.common.by import By  

# Enter your credentials - the zone name and password  
AUTH = 'USER:PASS'  

SBR_WEBDRIVER = f'https://{AUTH}@zproxy.lum-superproxy.io:9515'  
  
def main():  
    print('Connecting to 抓取浏览器...')  
    sbr_connection = ChromiumRemoteConnection(SBR_WEBDRIVER, 'goog', 'chrome')  
    with Remote(sbr_connection, options=ChromeOptions()) as driver:  
        print('Connected! Navigating...')  
        driver.get('https://example.com')  # use this, or replace with URL of your choice
        print('Taking page screenshot to file page.png')  
        driver.get_screenshot_as_file('./page.png')  
        print('Navigated! Scraping page content...')  
        html = driver.page_source  
        print(html)  
  
if __name__ == '__main__':  
   main()

4.4 查看实时浏览器会话示例代码

抓取浏览器 Debugger 使开发人员能够与 Chrome 开发者工具一起检查、分析和微调代码,从而实现更好的控制、可见性和效率。 您可以集成以下代码片段,为每个会话自动启动开发者工具:

/ Node.js Puppeteer - launch devtools locally  
  
const { exec } = require('child_process');  
const chromeExecutable = 'google-chrome';  
  
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));  
const openDevtools = async (page, client) => {  
    // get current frameId  
    const frameId = page.mainFrame()._id;  
    // get URL for devtools from scraping browser  
    const { url: inspectUrl } = await client.send('Page.inspect', { frameId });  
    // open devtools URL in local chrome  
    exec(`"${chromeExecutable}" "${inspectUrl}"`, error => {  
        if (error)  
            throw new Error('Unable to open devtools: ' + error);  
    });  
    // wait for devtools ui to load  
    await delay(5000);  
};  
  
const page = await browser.newPage();  
const client = await page.target().createCDPSession();  
await openDevtools(page, client);  
await page.goto('http://example.com');

五、未来反爬虫技术和使用总结

反爬虫技术预测

AI防御系统的越来越强,根据当下技术的发展方向,预测下一代反爬技术:

  1. 行为生物特征识别:分析操作节奏、击键特征
  2. 硬件指纹认证:可信执行环境(TEE)验证
  3. 区块链审计追踪:不可篡改的访问记录

Bright Data已开展动态环境模拟研究,通过在虚拟机中生成独特的硬件指纹组合,应对即将到来的硬件级检测,点击这里快来体验AI+爬虫方案吧!

使用体验总结

本次主要是针对当当网数据采集系统被Ban,然后采用Scraping Browser进行改造,改造后的数据系统在采取方面相比之前也采用了并发爬取的方案,由于早期版本的爬虫爬取数据采用的单线程爬取速度较慢,改用Scraping Browser之后,对代码也进行了改造,采用多线程的方式进行多条线路进行爬取,也不会被当当网的反爬取系统检测出来,这得益于Scraping Browser中的IP是动态切换,而且均是实际的住宅IP,很难被反爬虫系统发现。

如果你也有和我一样的问题,可以点击这里注册体验,注册即送2美元体验额度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识浅谈

您的支持将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值