Python爬虫进阶实战项目:使用青果网代理高效爬取某手办网详情数据
1 引言
计算机,获取数据,还在慢慢复制粘贴?聪明的朋友都已经用爬虫高效获取数据,但是经常搞爬虫遇见ip管控防爬,咱们怎么处理?在我看来随着数据需求增加,爬虫成为高效获取数据的工具。然而,许多网站通过IP管控等防爬机制来阻止爬虫访问,导致频繁封IP。为解决这个问题,我们可以通过使用代理IP池、调整请求头、模拟用户行为等方法,突破防爬虫限制,保持爬虫高效运行。
1.1 传统爬虫的局限性
传统爬虫存在一些局限性。首先,许多网站使用反爬虫机制,如验证码和IP限制,来阻止爬虫抓取数据。其次,对于动态网页,传统爬虫难以处理 JavaScript 渲染的内容,导致无法获取完整数据。此外,网站结构变化频繁,爬虫代码需要不断调整,增加了维护成本。与此同时,未经授权抓取数据可能涉及法律风险,侵犯网站的使用条款。最后,进行大规模抓取时,爬虫会消耗大量的网络带宽和计算资源,降低抓取效率
1.2 代理IP的必要性与优势
现代网站为了保护自身数据和减少恶意爬虫的影响,通常会在后台设置反爬虫机制,如限制每个IP的访问频率,自动检测并封禁访问异常的IP地址。当一个IP频繁请求相同或相似的数据时,网站可能会识别该IP为爬虫行为,并将其封禁。这时,代理IP可以有效解决这个问题。通过切换多个代理IP,爬虫能够避免频繁使用同一IP,从而降低被封禁的风险。此外,代理IP还能够模拟正常用户的访问行为,进一步规避反爬虫机制。
1.3 如何选择国内代理IP?
1.3.1 收费标准
这里我们列举四家产品进行对比,方便我们进行直观的参考一番~
● 青果网络
青果网代理产品主要分为四种:弹性提取、按量提取、均匀提起、通道提取
每天任意时段,日更200万资源,平均99.9%成功率的弹性提取
不限制使用的终端数,任意时段使用,城市级定位的按量提取
每分钟都能提起IP,城市级定位,平均99.9%成功率的均匀提取
多资源可选,日更200万资源,平均99.9%成功率的通道提取
每种套餐包含了6小时的免费体验时长,免费啊家人们,这不总比哪些不给你测试的机会直接让你充钱的厂家良心多了啊
● 四叶天
四叶天HTTP的产品可以选择不同的带宽还有城市的选择,但是时长这里没有没有免费体验,但总体是非常不错的
● 豌豆代理
豌豆代理,这部分时长的下限进一步提升到了1周,可能服务的用户不大相同吧,对于仅仅想尝鲜的用户可能不是那么友好。
● 小象代理
小象代理的包天价格也是十分划算的仅需5¥,但是相比于青果网络来讲,后者更实惠一点,1天的价位是4.4¥而且还提供6小时的免费体验时长。
1.3.2 综合性价比
1、从价格性价比来看,青果网络为每种产品都提供了6小时的免费体验时长,光从这点就领先其余厂家了,当然其余厂家例如小象和四叶天也是很便宜的,但对于豌豆来说,可能下限是一周所以显得贵了点。
2、另外为什么青果网络这么豪气,可以由于他们家采用的是自研的服务器,全国都有数据中心,设备占据了一定的优势,当然硬件够了,软件也不可能差。
3、再就是品牌溢价问题了,这决定了价位,这可能就是青果网络为什么比许多厂家价位低的主要原因了吧。
2 青果网络代理IP测试
2.1 HTTP代理测试是否有必要?
我先抛出结论,这是非常之有必要的好吧,一款优质的HTTP代理,是方方面面都优质的,具体可以表现为:响应速度、IP池可用率、还有带宽、匿名安全等等。
优质的HTTP代理会帮助我们更快的处理任务,相反就会造成程序员的情绪大起大落可以想象有多恐怖吧既然大家认识到了HTTP代理的重要性,我自掏腰包为大家测评一款在网络上小有名气的HTTP代理产品,青果网络HTTP代理,大家可以简单的参考一波,请看下节~
2.2 HTTP代理测试分为哪几点?
我们在进行HTTP代理测试时,通常需要重点关注几个核心指标:响应速度、可用率、稳定性、带宽、匿名度和安全性。
这些指标通常会直接影响到代理服务的质量和实际使用体验。在本次测试中,我选择了青果网络的动态共享HTTP代理,通过实际测试和综合分析,来评估其是否符合高效、安全的代理需求。
● 响应速度测试
首先是大家最为关注的测量HTTP代理与目标服务器之间的响应时间,评估其连接速度。既然是Speed,那么自然是越快越好了。在本次测试中,我们通过统计所有请求的响应时间并计算平均响应时间,发现青果网络的动态共享HTTP代理在响应速度上表现优异,能够快速传输请求并及时接收响应。相比其他代理,青果网络的代理更能减少延迟,提高数据抓取效率。
● 可用率测试
之后我们测试了高可用性的HTTP代理,这意味着它在大部分时间内能够稳定运行并顺利传递请求和响应。在测试过程中,我设置了30秒的响应时间阈值。测试中1000个代理中,青果网络提供的代理在超过95%的时间内能够在30秒内成功响应请求,显示出高可用性,适合需要长时间、大批量请求的应用场景。
● 稳定性测试
在数据抓取过程中,稳定性是一个不可忽视的因素。青果网络的代理在长时间的使用中保持了非常好的稳定性,连接没有频繁掉线或中断,毕竟如果中断可能会导致程序白跑,这对于程序员十分伤的嘞~这一稳定性说明青果网络的代理非常适合大规模、高频率的数据抓取任务,完全可以避免了中断带来的数据丢失。
● 带宽测试
HTTP代理的带宽决定了其数据传输的能力,尤其对于高流量的应用至关重要。青果网络的动态分享HTTP代理在带宽方面表现出色,其高带宽和低延迟保证了大规模数据传输的顺畅,测试过程中没有出现明显的带宽瓶颈或速度下降,带给开发者极为流畅的使用体验。
● 匿名度与安全性测试
对于需要保护隐私和安全的应用场景,匿名性和安全性是测试代理时必须重点考量的指标,没有出现DNS泄漏、WebRTC泄漏等安全问题,。
2.3 获取青果代理IP账号
测试完代理,我们接下来可以试着去部署,体验一下是不是真的那么优质~
2.3.1 注册与获取API链接
打开青果代理,体验一下
完成认证
之后我们选择免费的6小时
接下来提交订单即可
购物完成之后我们点击提取IP
接下来设置提取规则,这里我们默认就行
网页上成功显示IP,说明这里是没有问题的
2.3.2 Python脚本获取IP
复制API链接
准备代码,我们将其替换成自己的代理
import requests
import time
def get_ip():
url = "自己的API链接如上图"
while 1:
try:
r = requests.get(url, timeout=10)
except:
continue
ip = r.text.strip()
if '请求过于频繁' in ip:
print('IP请求频繁')
time.sleep(1)
continue
break
proxies = {
'https': '%s' % ip
}
return proxies
if __name__ == '__main__':
proxies = get_ip()
print(proxies)
替换完成我们运行测试一下
3 某手办网站数据爬取实战
3.1 环境准备
这里我们需要安装一些必要的库,requests、BeautifulSoup、csv pip install 库名即可
3.2 网站分析
对于其他开发者来讲一般都是爬取电商网站,今天来点有意思的,如何高效爬取一个手办网 https://www.hpoi.net/index/home
(1)我们进入网站后点击键盘的F12,或者右键检查,就可以获取我们想要的必要数据了,同时我们可以复制请求头信息这里复制User-Agent即可~
上图对应的URL:
https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page=1
(2)接着我们点击第二页、第三页
https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page=2
https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page=3
我们将其列出来:
https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page=1
https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page=2
https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page=3
我们就可以观察出来,page后跟着的恰恰是页数,那么我们就好办了,我们先粗略的记录一下翻页的逻辑,就是使用for循环
(3)再接着我们需要选中想要爬取的内容,点击一下,在HTML的结构里面就可以看到具体的数据了,我们接下来处理就是要使用这个HTML结构
3.3 导入模块
import requests
from bs4 import BeautifulSoup
3.4 实现翻页功能
3.4.1 设置请求头
这里根据我设置User-Agent即可(可以参照3.2网站分析取得请求头信息),别的网站可以还需要添加更多信息
3.4.2 循环爬取前三页
使用for循环进行爬取
for page in range(1, 4):
url = f'https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page={page}
3.4.3 发送请求并获取响应并解析内容
调用requests进行获取响应,同时调用BeautifulSoup进行解析
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
3.4.4 提取手办信息
product_elements = soup.select('.hpoi-detail-grid-right')
for product in product_elements:
name = product.select_one('.hpoi-detail-grid-title a').text.strip()
...
3.5 通过代理IP发送请求
在使用代理IP发送请求之前,我们需要进行白名单的添加
完整代码:
import requests
from bs4 import BeautifulSoup
import time
def get_ip():
url = "https://share.proxy.qg.net/get?key=578E2022&num=1&area=&isp=0&format=txt&seq=\r\n&distinct=false"
while 1:
try:
r = requests.get(url, timeout=10)
except:
continue
ip = r.text.strip()
if '请求过于频繁' in ip:
print('IP请求频繁')
time.sleep(1)
continue
break
proxies = {
'https': '%s' % ip # 生成代理字典
}
return proxies
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'
}
for page in range(1, 4):
url = f'https://www.hpoi.net/hobby/all?order=add&r18=-1&workers=&view=3&category=100&page={page}'
proxies = get_ip()
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
product_elements = soup.select('.hpoi-detail-grid-right')
for product in product_elements:
name = product.select_one('.hpoi-detail-grid-title a').text.strip()
manufacturer = product.select_one('em:contains("厂商:")')
ship_date_element = product.select_one('em:contains("出荷:")')
if ship_date_element:
ship_date_text = ship_date_element.find_next('span').get_text(strip=True)
else:
ship_date_text = 'N/A'
add_date_element = product.select_one('em:contains("新增:")')
if add_date_element:
add_date_text = add_date_element.find_next('span').get_text(strip=True)
else:
add_date_text = 'N/A'
if manufacturer:
manufacturer_text = manufacturer.find_next('span').text.strip()
else:
manufacturer_text = 'N/A'
print(f'产品名称: {name}')
print(f'厂商: {manufacturer_text}')
print(f'出荷日期: {ship_date_text}')
print(f'新增日期: {add_date_text}')
print('---')
print(f'第 {page} 页数据已爬取完毕\n')
else:
print(f'请求失败,状态码:{response.status_code}')
except requests.exceptions.RequestException as e:
print(f'请求发生异常: {e}')
time.sleep(10) # 出现异常时,暂停3秒后继续尝试
如下:
提取并保存数据
接下来我们写一段保存的代码,这里使用csv进行保存
# 打开CSV文件进行写入
with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['产品名称', '厂商', '出荷日期', '新增日期'] # CSV文件的列名
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader() # 写入列名
4 总结
我们综合上面的测试数据以及案例演示,都证明了青果网络代理是一款十分优质的代理,无论是价位、速度、安全性、还是里面的套餐的种类和细节,都极大的满足了绝大开发者的需求。是我们在完成爬虫任务/数据采集时候的辅助
感兴趣的小伙伴可以体验一下,体验链接:青果网络