工欲善其事,必先利其器
先来一起看下今天的武器: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 现代防御系统的技术拆解
当前主流网站采用**五层防御体系**:
-
网络层:IP信誉数据库(如AWS已知IP段)
-
传输层:TLS指纹识别
-
浏览器层:Canvas/WebGL指纹生成
-
行为层:鼠标移动轨迹分析
-
验证层:智能验证码(如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 v2 | 12% | 99.3% |
hCaptcha | 8% | 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 浏览器指纹混淆
关键指纹参数对比:
参数 | 真实浏览器 | 普通Headless | Bright 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 和 验证码问题
- 引入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防御系统的越来越强,根据当下技术的发展方向,预测下一代反爬技术:
- 行为生物特征识别:分析操作节奏、击键特征
- 硬件指纹认证:可信执行环境(TEE)验证
- 区块链审计追踪:不可篡改的访问记录
Bright Data已开展动态环境模拟研究,通过在虚拟机中生成独特的硬件指纹组合,应对即将到来的硬件级检测,点击这里快来体验AI+爬虫方案吧!
使用体验总结
本次主要是针对当当网数据采集系统被Ban,然后采用Scraping Browser进行改造,改造后的数据系统在采取方面相比之前也采用了并发爬取的方案,由于早期版本的爬虫爬取数据采用的单线程爬取速度较慢,改用Scraping Browser之后,对代码也进行了改造,采用多线程的方式进行多条线路进行爬取,也不会被当当网的反爬取系统检测出来,这得益于Scraping Browser中的IP是动态切换,而且均是实际的住宅IP,很难被反爬虫系统发现。
如果你也有和我一样的问题,可以点击这里注册体验,注册即送2美元体验额度。