目录
- 反爬虫的本意和其带来的挑战
- 目标
- 实战
-
- 开发准备
- 代码开发
- 发现问题
-
-
- 发现问题[01]
-
- 发现问题[02]
-
- 解决问题
-
-
- 解决问题[01]
-
- 解决问题[02]
-
- 最终结果
- 结语
反爬虫的本意和其带来的挑战
在这个数字化时代社交媒体已经成为人们表达观点的重要渠道,对企业来说,监控社交媒体上的舆情动态可以提供宝贵的数据支持以帮助优化产品和服务。对个人来说,可以通过监控分析相关话题,来了解行业趋势、扩展知识面从而更好的进行规划。然而 目前的很多社交媒体都有相当完善的反爬虫机制(例如:IP封禁),虽然它的本意是为了保护自身(例如:恶意的爬虫攻击(DOS)高速频繁的请求会增加目标平台的服务器负担【503】),但是对于合法的、低频率的采集任务增加了技术难度。
下图是连续频繁的请求触发了平台的保护机制导致目标服务器拒绝访问【403】
GIF动图 ↓:
目标
- 采集平台:知乎
- 采集数据:新能源汽车话题
- 标题
- 点赞量
- 作者
- 使用技术手段(青果代理IP)绕过反爬虫机制
- 将采集到的数据以文本的格式保存在txt文本中
实战
如发现有错误请指出,谢谢~
开发准备
安装python库requests
、BeautifulSoup
使用终端运行
bash
pip install requests
bash
pip install bs4
requests: 用于发送HTTP请求
BeautifulSoup: 用于解析HTML数据
代码开发
导入第三方库到代码中
python
import requests
from bs4 in BeautifulSoup
先获取需要爬取的目标:
python
url = "https://www.zhihu.com/topic/19731651/hot"
伪装浏览器信息:
python
requestHeader = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"}
向目标网站发送网络请求,使用get请求:
python
send_request = requests.get(url,headers=requestHeader)
获取到HTML数据:
python
HTML_source = send_request.text
analyse_data = BeautifulSoup(HTML_source,"html.parser")
分析获取到所需数据:
python
fetch_data = analyse_data.findAll(attrs={"data-za-detail-view-element_name":"Title"}) # 获取标题
fetch_data_num = analyse_data.findAll("button",attrs={"class":"Button VoteButton VoteButton--up FEfUrdfMIKpQDJDqkjte"}) # 获取赞成数
fetch_data_name = analyse_data.findAll("a",attrs={"class":"UserLink-link"}) # 获取作者id
使用open函数创建本文文件为后续写入做准备:
python
text_data = open(r"目录:\爬取数据存放.txt","w",encoding="UTF-8")
创建三个列表为后续写入文本做准备
python
title_name = []
support_num = []
author_name = []
使用for循环将标题写入列表
python
for x in fetch_data:
title_name.append(x.text.strip())
其余点赞量等类似
python
for y in fetch_data_num:
support_num.append(y.text)
for z in fetch_data_name:
author_name.append(z.text.strip())
将数据写入文本并进行一定的排版(预留一个num充当文本中的编号)
python
num = 0
for data,data_1,data_2 in zip(title_name,support_num,author_name):
num+=1
text_data.write("数量:"+ str(num) + "\n")
text_data.write("标题:" + str(data) + "\n")
text_data.write("点赞量:" + data_1 + "\n")
text_data.write("博主名:" + data_2 + "\n" + "--"*20 + "\n")
发现问题
1. 发现问题[01]
目前一路写到这看似没有问题,但是实际运行时就能发现,"博主id"列表输出时有空字符串。如下为输出结果
bash
['', '玩车有料', '', '大树', '', '赫尔辛根默斯肯', '', '小权兄弟', '', '产品张小能', '', 'JackyQ', '', '玩车情报局', '', '毅种循环', '', '徐里里', '', '瞻云', '', '叶子豪', '', '太阳城索拉利斯', '', '子乾', '', '南部之星', '', '徐里里', '', '灵活就业engineer', '', '电动姬', '', '人类道德洼地']
2. 发现问题[02]
在运行时有很大概率出现【403】这不仅仅时IP问题。返回的HTML状态码和源码
bash
<Response [403]>
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"/></head><body><div style="color:#535861;opacity: 0.1;display: flex;justify-content: center;">知乎,让æ¯ä¸€æ¬¡ç‚¹å‡>>都å
æ>>¡æ„义 â€"â€" 欢迎æ¥åˆ°çŸ¥ä¹Žï¼Œå'现é---®é¢˜èƒŒåŽçš„ä¸--界。</div><script crossorigin="" data-assets-tracker-config='{"appName":"zse_ck","trackJSRuntimeError":true}' src="https://static.zhihu.com/zse-ck/v3.6.js"></script></body></html>
解决问题
1. 解决问题[01]
这个问题好解决只要清除空字符串数据就行。导致的原因是HTML中有两份一样的"class":"UserLink-link"
2. 解决问题[02]
导致运行时可能出现【403】的两种可能(目前我发现的)
- 没有cookie(GIF动图示例)
- 添加cookie即可
- 添加cookie即可
- IP被封禁
- 这个问题就得回到目标中的"绕过反爬虫机制"了
- 选择代理ip可以绕过反爬虫机制,确保数据的顺利抓取,这里我推荐我的老朋友------青果代理IP,推荐的理由非常简单,在数据采集中可以帮我节省大量时间和精力!!!关键速度贼快!
- 现在开始使用青果代理绕过反爬虫机制
- 找到分配到的地址和密钥
- 在代码中配置代理池
python
# 代理IP隧道域名称:端口号
tunnel = "********.qg.net:*****"
# 用户名密码
username = "******"
password = "********"
proxies = {
"http": f"http://{username}:{password}@{tunnel}",
"https": f"http://{username}:{password}@{tunnel}"
}
在请求中添加代理池
python
send_request = requests.get(url,headers=requestHeader,proxies=proxies)
最终结果
至此采集"知乎"------"新能源汽车"的数据已经完成虽然不是很完善但也七七八八了
来看看最总输出结果吧
bash
数量:1
标题:卖掉油车,换了电车,如今开了2年多,终于明白网上说的都是真的
点赞量:赞同 5923
博主名:玩车有料
----------------------------------------
数量:2
标题:北京第一批新能源老车主换车笔记
点赞量:赞同 766
博主名:大树
----------------------------------------
数量:3
标题:西方电动车不干了,我们咋办?
点赞量:赞同 1182
博主名:赫尔辛根默斯肯
----------------------------------------
数量:4
标题:欧美不和我们玩了,新能源车是欧美的阴谋吗?中国如何破局?
点赞量:赞同 1624
博主名:小权兄弟
----------------------------------------
数量:5
标题:充电桩终极测评:小充嗨跑、公牛、普诺得、倍思谁是王者?
点赞量:赞同 1625
博主名:产品张小能
----------------------------------------
数量:6
标题:这个国庆,我整理了全网报道的2023年1-9月的232起新能源汽车起火案例数据库
点赞量:赞同 1096
博主名:JackyQ
----------------------------------------
数量:7
标题:我的小米SU 7 Max创始版交付了,说下优缺点和使用感受
点赞量:赞同 3196
博主名:毅种循环
----------------------------------------
数量:8
标题:丰田宣布固态电池技术获重大突破「10 分钟充满跑 1200 公里,体积重量成本将减半」,影响几何?
点赞量:赞同 1.3 万
博主名:徐里里
----------------------------------------
数量:9
标题:如何看待领克09 EM-P 成功驱动 45 吨摩天巨轮?
点赞量:赞同 154
博主名:瞻云
----------------------------------------
数量:10
标题:秦卖7.98万真的能盈利吗?
点赞量:赞同 1.2 万
博主名:叶子豪
----------------------------------------
等等
源代码 ↓ ↓ ↓(请自行替换*cookie、代理IP隧道域名称、端口号、用户名、密码、目录位置 *):
python
import requests
from bs4 import BeautifulSoup
# 伪装浏览器
requestHeader = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"cookie":"**********"}
# 代理IP隧道域名称:端口号
tunnel = "******.qg.net:****"
# 用户名密码
username = "******"
password = "********"
proxies = {
"http": f"http://{username}:{password}@{tunnel}",
"https": f"http://{username}:{password}@{tunnel}"
}
# 需要爬取的url【网页】
url = "https://www.zhihu.com/topic/19731651/hot"
# 发送请求
send_request = requests.get(url,headers=requestHeader,proxies=proxies)
# 获取HTML源码
HTML_source = send_request.text
# 分析HTML数据并获取所需数据
analyse_data = BeautifulSoup(HTML_source,"html.parser")
fetch_data = analyse_data.findAll(attrs={"data-za-detail-view-element_name":"Title"})
fetch_data_num = analyse_data.findAll("button",attrs={"class":"Button VoteButton VoteButton--up FEfUrdfMIKpQDJDqkjte"})
fetch_data_name = analyse_data.findAll("a",attrs={"class":"UserLink-link"})
text_data = open(r"目录:\爬取的数据.txt","w",encoding="UTF-8")
title_name = []
support_num = []
author_name = []
for x in fetch_data:
title_name.append(x.text.strip())
for y in fetch_data_num:
support_num.append(y.text)
for z in fetch_data_name:
author_name.append(z.text.strip())
while '' in author_name:
author_name.remove('')
num = 0
for data,data_1,data_2 in zip(title_name,support_num,author_name):
num+=1
text_data.write("数量:"+ str(num) + "\n")
text_data.write("标题:" + str(data) + "\n")
text_data.write("点赞量:" + data_1 + "\n")
text_data.write("博主名:" + data_2 + "\n" + "--"*20 + "\n")
结语
在数字化社交媒体时代,舆情监控已成为获取行业动态和用户反馈的重要渠道。然而面对着反爬虫机制的挑战,代理ip可以帮助我们有效、高效地解决反爬虫问题。在实际操作中使用青果网络代理IP服务是非常顺利且高效的,它提供了稳定的连接和高速的响应,确保了数据采集的连续性,还提供了强大的API接口,方便用户进行批量管理和调度代理IP,进一步提升了数据采集的效率和灵活性。
而且青果网络为能给广大用户先行体验代理ip的使用效果,提供了6小时免费试用活动:
感兴趣、有需求的可以点这里进行试用