写点什么

Python 爬虫进阶实战项目:使用青果网代理高效爬取某手办网详情数据

作者:Toekn_w
  • 2024-11-30
    河南
  • 本文字数:8536 字

    阅读完需:约 28 分钟

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 收费标准

这里我们列举四家产品进行对比,方便我们进行直观的参考一番~


● 青果网络


青果网代理产品主要分为四种:弹性提取、按量提取、均匀提起、通道提取


  1. 每天任意时段,日更 200 万资源,平均 99.9%成功率的弹性提取

  2. 不限制使用的终端数,任意时段使用,城市级定位的按量提取

  3. 每分钟都能提起 IP,城市级定位,平均 99.9%成功率的均匀提取

  4. 多资源可选,日更 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 代理在带宽方面表现出色,其高带宽和低延迟保证了大规模数据传输的顺畅,测试过程中没有出现明显的带宽瓶颈或速度下降,带给用户极为流畅的使用体验。


匿名度与安全性测试


对于需要保护隐私和安全的应用场景,匿名性和安全性是测试代理时必须重点考量的指标。青果网络的代理有效地隐藏了用户的真实 IP,且没有出现 DNS 泄漏、WebRTC 泄漏等安全问题,保证了用户的隐私安全。在隐私保护方面,青果网络的代理表现出色,符合高标准的安全需求。


综合评估:青果网络代理的优质表现


结合以上测试结果,青果网络的动态共享 HTTP 代理在响应速度、可用率、稳定性、带宽和安全性等方面均表现优异,符合高效、可靠、安全的代理要求。

2.3 获取青果代理 IP 账号

测试完代理,我们接下来可以试着去部署,体验一下是不是真的那么优质~

2.3.1 注册与获取 API 链接

打开官网链接,我们注册一个账号先



跟随注册指引即可完成注册,注册完事别忘了要实名哦~



之后我们选择免费的 6 小时



接下来提交订单即可



购物完成之后我们点击提取 IP



接下来设置提取规则,这里我们默认就行



网页上成功显示 IP,说明这里是没有问题的


2.3.2 Python 脚本获取 IP

复制 API 链接



准备代码,我们将其替换成自己的链接


import requestsimport 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 requestsfrom 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()    ...
复制代码


下面的代码是不通过代理进行爬取的完整源码


import requestsfrom bs4 import BeautifulSoup
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}'
response = requests.get(url, headers=headers)
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}')
复制代码

3.5 通过代理 IP 发送请求

在使用代理 IP 发送请求之前,我们需要进行白名单的添加



添加这里我们选择一键添加即可



添加完事,我们就可以将上面两个代码进行整合


import requestsfrom bs4 import BeautifulSoupimport time

# 获取代理 IP 的函数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秒后继续尝试
复制代码


结果如下


3.6 提取并保存数据

接下来我们写一段保存的代码,这里使用 csv 进行保存


# 打开CSV文件进行写入with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:    fieldnames = ['产品名称', '厂商', '出荷日期', '新增日期']  # CSV文件的列名    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader() # 写入列名
复制代码

3.7 完整源码展示

下面是完整的源码展示,记得替换自己的链接还有设置白名单哦!!!


import requestsfrom bs4 import BeautifulSoupimport timeimport csv

# 获取代理 IP 的函数def get_ip(): url = "自己的链接" 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'}
# 打开CSV文件进行写入with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['产品名称', '厂商', '出荷日期', '新增日期'] # CSV文件的列名 writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader() # 写入列名
# 循环爬取前三页的数据 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')
# 打印获取到的信息并写入CSV文件 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'
# 写入数据到CSV文件 writer.writerow({ '产品名称': name, '厂商': manufacturer_text, '出荷日期': ship_date_text, '新增日期': add_date_text })
print(f'第 {page} 页数据已爬取完毕\n')
else: print(f'请求失败,状态码:{response.status_code}')
except requests.exceptions.RequestException as e: print(f'请求发生异常: {e}') time.sleep(10) # 出现异常时,暂停10秒后继续尝试
复制代码


保存为 product.csv 文件,双击进行查看


4 总结

​ 我们综合上面的测试数据以及案例演示,都证明了青果网络代理是一款十分优质的代理产品,无论是价位、速度、安全性、还是里面的套餐的种类和细节,都极大的满足了绝大客户的需求。是我们在完成爬虫任务/数据采集时候的好助手。


​ 如果你是爬虫领域的小白,你可以试试青果网络代理,这样会帮助你更快的了解爬虫,更快的学习,如果你是爬虫领域的大牛,你更需要试试这款代理,它会帮助你更快更稳的爬取/采集数据,同时性价比也是杠杠的~


​ 感兴趣的小伙伴可以体验一下,官网链接:https://www.qg.net/


当然大家也可以直接点击下面链接,直接跳转领取福利进行实操体验:https://www.qg.net/product/proxyip.html?platform=iq&section=%E4%BB%A3%E7%90%86ip&creator=010304&aff=960749


发布于: 刚刚阅读数: 4
用户头像

Toekn_w

关注

还未添加个人签名 2022-06-01 加入

还未添加个人简介

评论

发布
暂无评论
Python爬虫进阶实战项目:使用青果网代理高效爬取某手办网详情数据_爬虫_Toekn_w_InfoQ写作社区