4个数据爬虫的挑战以及解决方案测试

576 阅读12分钟

引言

"数据爬虫",也就是网络数据收集,在网站没有规模化之前曾经是相对容易完成的,但是现在却变得越来越具有挑战性。本文将通过在数据爬虫中普遍会遇到的4个问题,详细解释每种爬取途径的优点和缺点,以及如何最有效、快速且准确地收集真实数据。

4个常见挑战

当你想从一个网站上收集内容,在设计方案的阶段或已开始着手进行收集的时候,你可能需要考虑以下四个主要挑战

挑战一:软件

使用第三方供应商还是建立自己的软件基础设施?

● 定制化开发 (DIY)

你可以建立软件开发团队编写专有代码来创建一个数据爬虫。有多个开源的Python软件包,例如。

o - BeautifulSoup

o - Scrapy

o - Selenium

定制化的好处是,软件是根据你目前的需要定制的。然而,其成本也很高。

o - 数百或数千小时的编码工作

o - 软件和硬件的购买和许可

o - 代理ip基础设施和带宽仍将花费你的成本,更严重的是,即使数据收集失败,也会计费

软件维护是最大的挑战之一。当目标网站改变其页面结构时。这种情况经常发生,爬虫就会中断,代码就需要修复并重新上线。而且你还需要克服下面列出的另外三个挑战。

● 数据收集工具

你也可以使用第三方供应商,专门从事这一数据收集领域的工作,这样企业可以尽可能关注数据本身,而不是数据爬取过程中可能遇到的问题(反爬虫),下面详细介绍。

另外互联网上的其他软件可能是旧的和过时的。选型时需要注意,如果该网站看起来像是在上个世纪创建的,这可能反映在他们的软件上。需要强调的一点是,如果选型该类工具,注意供应商是否支持按成功收集数据收费

挑战之二:封锁

当我们试图收集一个网站数据时,往往会遇到目标网站机器人智能风控策略控制(“圈中”),以下是一些网站"流行"的反爬虫策略:

1. 对IP的速率限制

当你从同一个IP地址向一个目标网站发送多个请求时,这可以被归类为可疑的活动。无论该网站设置了什么限制(可能是15个请求或1,500个),一旦超过这个限制,你的数据收集操作将被验证码或错误信息打断,需要人工/人为干预进行恢复,认为干预在规模化数据收集过程中显然是不可行的。

2. 客户端指纹检测(浏览器,手机等终端设备或软件)

“指纹”是指通过获取本地机器各种信息,例如系统字体、分辨率、浏览器模式、语言、时区、UerAgent、计算机硬件,一些计算机的综合信息来计算出一个唯一值,这个唯一值就是指纹。很多大型网站为了保证数据质量等原因,会利用此类指纹来判断账号是否在同一台电脑等,检测到了就将违规批量操作的账号进行封停

3. 用户代理的检测

网站使用不同的标头(headers),例如一些网站可能利用 "HTTP "标头来限制第三方爬虫并阻止或限制访问,保防止数据在互联网传输过程泄漏。

4. IP地理位置检测

一些网站实际上会根据你当前的地理位置来阻止你。这通常是由于他们希望根据地理位置定制内容、政府对某些信息的限制或内容许可,基于与当地电视频道签署的协议的内容许可限制,以及类似情况。

挑战之三:速度与规模化

数据爬取的速度和规模都是受底层代理基础设施影响的:

● - 许多数据收集项目开始时只有几万个网页,但很快就扩展到几百万个。

● - 大多数工具的收集速度很慢,每秒同时请求次数有限。请确保你的供应商的收集速度,考虑所需的页面数量,并考虑收集频率。如果您只需要抓取少量的页面,而且您可以将其安排在晚上运行,那么这对您来说可能不是一个问题

挑战之四:数据的准确性

爬虫程序可能只能成功收集部分数据。更具挑战的是网站页面结构的不定期变化可能会破坏数据收集程序,导致数据的不完整或不准确。

除了数据集的准确性和完整性之外,还要检查数据将如何交付以及以何种形式交付。这些数据必须与你现有的系统无缝整合。通过定制你的数据库模式,加快ETL 数据分析的进程。

风控解锁方案测试

根据上述分析,对于一些企业来说,定制化开发程序必不可少,但是是否有更好的方案帮助我们解决数据提取目标网站封锁的挑战。今天我们介绍一种方案的测试评估,利用Bright Data 的亮数据解锁器(以下称Web Unlocker )来绕过网站的风控策略,降低爬虫软件开发成本,从而提高数据的准确性以及效率

什么是Bright Data Web Unlocker

Web unlocker是 BrightData 提供的一个自动化模块,可以为你以极高的成功率(通常是100%)解锁被封禁的目标网站,所有你需要做的就是发送一个请求,而这个工具会处理其余的事情,包括适应不断变化的目标网站的风控策略。

Web Unlocker能够自动化、透明化处理以下内容:

  • IP 自动轮换

  • 请求错误重试

  • 请求http header

  • 用户代理 User agent

  • 客户端指纹

另外使用这个工具的一个关键优势是,你只需要为成功获取数据的请求付费。这也是上文提到工具选型的重要因素之一。

Bright Data Web Unlocker 原理

如下图,

1. 客户端发送请求到 带有Web Unlocker处理引擎的超级代理(Super proxy),超级代理是Bright Data 提供的代理工具

2. Web unlocker引擎会调整请求头,请求协议等,

3. 超级代理会基于Bright Data 提供的 4 大类全球 IP 池进行代理请求,请求过程附加客户端指纹信息,尽可能确保不会被封禁,如果请求成功,返回客户端

4. 如果失败, Web unlocker,进行其他策略尝试,如 IP 切换,指纹模拟等,进行请求重试

image.png

数据爬虫方案测试

测试用例设计

我将对比两家代理供应商,以及不同的产品,以同一个网站为目标进行测试。

代理提供商代理类型测试用例
smartproxy动态代理获取亚马逊首页数据www.amazon.com/ 循环执行100次
BrightData动态代理获取亚马逊首页数据www.amazon.com/ 循环执行100次
BrightDataUnblocker获取亚马逊首页数据www.amazon.com/ 循环执行100次

测试用例一 :使用SmartProxy 动态代理

代理准备工作 1:配置代理通道

注册代理账号,创建动态代理通道

image.png

编写测试代码,使用动态代理IP,抓取网页数据

此处使用python进行测试, 爬取测试的目标网站我们选择亚马逊(有完整的风控策略)

声明:此代码仅用于个人测试

#!/usr/bin/env python
import sys
import ssl
import requests

if name == "main":
ssl._create_default_https_context = ssl._create_unverified_context
context = ssl._create_unverified_context()
target = sys.argv[1] if len(sys.argv) > 1  else None
country = sys.argv[2] if len(sys.argv) > 2  else None
city = sys.argv[3] if len(sys.argv) > 3  else None

    ssl._create_default_https_context = ssl._create_unverified_context
http_proxy = 'http://username{location}:password@proxy.smartproxycn.com:1000'
https_proxy = 'http://username{location}:password@proxy.smartproxycn.com:1000'

    if not target:
target = 'www.amazon.com/'
customerLocation = ""
if country:
customerLocation = customerLocation + "_area-" + country
if country and city:
customerLocation = customerLocation + "_city-" + city
http_proxy = http_proxy.format(location=customerLocation)
https_proxy = https_proxy.format(location=customerLocation)

    if sys.version_info[0]==3:
errorCount = 0
badContentCount = 0
for i in range(0, 100):
try:
print("The " + str(i) + " time to scraper ")
html = open("./smart/proxy-dip-" + str(i) + ".html", "w")

                x = requests.get(target, proxies={'https': https_proxy, 'http': http_proxy}, verify=False)
html.write(str(x.content))
if "To discuss automated access to Amazon data" in str(x.content):
badContentCount = badContentCount + 1
except:
errorCount = errorCount + 1
print("error count is " + str(errorCount))
print("bad content count is " + str(badContentCount))

该测试类支持通过参数调整代理通道 ip 池所在地,第一个参数是目标网站,第二个参数是代理ip归属国,第三个参数是代理ip归属城市,便于调试

PS: 测试时注意调整http_proxy和https_proxy中的用户名和密码

测试用例二 :使用Bright Data 动态代理

代理准备工作 1:配置代理通道

这里为了进行不同方案对比,配置了两个代理通道,

动态住宅ip代理:名称是proxy_witout_unblocker

image.png Web unlocker解锁器:名称是test_unlocker_zone

image.png

代理准备工作 2:搭建Bright Data Proxy manager(可选)

Proxy manager 是代理软件的一个私服,可以根据企业需要搭建在爬虫软件所在数据中心,方便管理, 同时Bright Data 提供全球就近代理服务,可以跳过proxy manager 的搭建。

● 通过docker 镜像快速搭建企业本地化代理工具,如下:

docker run -d  -p22225:22225 -p22999:22999 -p24000:24000 luminati/luminati-proxy proxy-manager

PS:其中22999端口对应管理界面,24000对应对外服务的端口,如过需要提供提供代理端口,可自定义端口范围

● 配置Proxy manager

登陆本地22999端口(Proxy manager管理后台),配置需要访问的代理通道

image.png

image.png

根据数据爬虫的场景,选择需要的代理通道(第一步中创建的),配置后可以修改通道,后面的步骤会进行切换测试

编写测试代码,使用不带Web Unlocker进行代理请求

此处使用python进行测试, 爬取测试的目标网站我们选择亚马逊(有完整的风控策略)

声明:此代码仅用于个人测试

#!/usr/bin/env python
import sys
import ssl
import requests

if name == "main":
ssl._create_default_https_context = ssl._create_unverified_context
context = ssl._create_unverified_context()
target = sys.argv[1] if len(sys.argv) > 1  else None
country = sys.argv[2] if len(sys.argv) > 2  else None
city = sys.argv[3] if len(sys.argv) > 3  else None

    ssl._create_default_https_context = ssl._create_unverified_context
http_proxy = 'http://username{location}:password@zproxy.lum-superproxy.io:22225'
https_proxy = 'https://username{location}:password@zproxy.lum-superproxy.io:22225'

    if not target:
target = 'www.amazon.com/'
customerLocation = ""
if country:
customerLocation = customerLocation + "-country-" + country
if country and city:
customerLocation = customerLocation + "-city-" + city
http_proxy = http_proxy.format(location=customerLocation)
https_proxy = https_proxy.format(location=customerLocation)

    if sys.version_info[0]==3:
errorCount = 0
badContentCount = 0
for i in range(0, 100):
try:
print("The " + str(i) + " time to scraper ")
html = open("bd-ip/am-" + str(i) + ".html", "w")

                x = requests.get(target, proxies={'https': https_proxy,'http': http_proxy} , verify=False)
html.write(str(x.content))
if "To discuss automated access to Amazon data" in str(x.content):
badContentCount = badContentCount + 1
except:
errorCount = errorCount + 1
print("error count is " + str(errorCount))
print("bad content count is " + str(badContentCount))

该测试类支持通过参数调整代理通道 ip 池所在地,第一个参数是目标网站,第二个参数是代理ip归属国,第三个参数是代理ip归属城市,便于调试

PS: 测试时注意调整http_proxy和https_proxy中的用户名和密码(Bright Data 创建的代理通道会提供相应的信息)

测试用例三 :使用Bright Data Web Unblocker

编写测试代码,使用 Web Unlocker 智能代理

同样此处使用python进行测试

声明:此代码仅用于个人测试

#!/usr/bin/env python
import sys
import ssl
import requests

if name == "main":
ssl._create_default_https_context = ssl._create_unverified_context
context = ssl._create_unverified_context()
target = sys.argv[1] if len(sys.argv) > 1  else None
country = sys.argv[2] if len(sys.argv) > 2  else None
city = sys.argv[3] if len(sys.argv) > 3  else None

    ssl._create_default_https_context = ssl._create_unverified_context
http_proxy = 'http://username{location}:password@zproxy.lum-superproxy.io:22225'
https_proxy = 'https://username{location}:password@zproxy.lum-superproxy.io:22225'

    if not target:
target = 'www.amazon.com/'
customerLocation = ""
if country:
customerLocation = customerLocation + "-country-" + country
if country and city:
customerLocation = customerLocation + "-city-" + city
http_proxy = http_proxy.format(location=customerLocation)
https_proxy = https_proxy.format(location=customerLocation)

    if sys.version_info[0]==3:
errorCount = 0
badContentCount = 0
for i in range(0, 100):
try:
print("The " + str(i) + " time to scraper ")
html = open("unblocker/am-unblocker-" + str(i) + ".html", "w")

                x = requests.get(target, proxies={'https': https_proxy, 'http': http_proxy}, verify=False)
html.write(str(x.content))
if "To discuss automated access to Amazon data" in str(x.content):
badContentCount = badContentCount + 1
except:
errorCount = errorCount + 1
print("error count is " + str(errorCount))
print("bad content count is " + str(badContentCount))

第四步:结果数据对比分析

本次测试关注两个指标,代理稳定性、风控处理成功率。

代理稳定性: 评估可否支持大量数据抓取请求,指通过代理请求目标网站成功率,不代表数据正确获取

风控处理稳定性: 评估是否可以稳定获取用户需求数据,请求成功有时获取的是风控提示数据,因此需要判断是否是用户真实需要的数据,亚马逊风控策略会处理用户请求结果,如果结果中包含关键字“To discuss automated access to Amazon datax0;”,代表请求被风控处理

通过多次执行测试用例,结果如下:

代理代理稳定性风控处理稳定性
smartproxy 动态代理98%2%
BrightData 动态代理99%4%
BrightData Unblocker100%100%

通过三个测试用例测试,我们通过循环获取了100次界面,大部分结果是右侧的结果,显然用普通代理,很容易被封禁,请求成功率低。

请求成功但内容被风控的返回结果如下:

image.png

请求成功且内容正确的的返回结果如下:

image.png

总结

现在注册,免费7天试用

根据实际测试及综合分析方案,亮数据解锁器Web Unlocker有三个主要部分是其他代理工具所缺乏的:

1. 请求管理。重试逻辑和验证码解决,以最快的速度获得数据,尽可能提供最高的成功率。

2. 完整的用户环境模拟包括: - 网络层面--IP类型、IP轮询、TLS握手 - 协议级--HTTP请求头操作、用户代理生成和HTTP2支持 - 客户端级别 - Cookie管理和浏览器指纹模拟(例如,字体、音频。canvas/webgI指纹等 - 操作系统/硬件层面 - 仿真设备枚举、屏幕分辨率、内存、CPU等。

3. 内容验证。你的数据的完整性被自动验证,使用的参数包括请求时间、数据类型和响应内容,以确保你得到是最高质量的信息

使用Web Unlocker,可以在降低企业和个人开发成本的同时稳定的获得数据,同时配合亮数据的基础设施更能确保数据的高准确率。