爬虫实战:采集知乎XXX话题数据

目录

  • 反爬虫的本意和其带来的挑战
  • 目标
  • 实战
    • 开发准备
    • 代码开发
    • 发现问题
        1. 发现问题[01]
        1. 发现问题[02]
    • 解决问题
        1. 解决问题[01]
        1. 解决问题[02]
    • 最终结果
  • 结语

反爬虫的本意和其带来的挑战

在这个数字化时代社交媒体已经成为人们表达观点的重要渠道,对企业来说,监控社交媒体上的舆情动态可以提供宝贵的数据支持以帮助优化产品和服务。对个人来说,可以通过监控分析相关话题,来了解行业趋势、扩展知识面从而更好的进行规划。然而 目前的很多社交媒体都有相当完善的反爬虫机制(例如:IP封禁),虽然它的本意是为了保护自身(例如:恶意的爬虫攻击(DOS)高速频繁的请求会增加目标平台的服务器负担【503】),但是对于合法的、低频率的采集任务增加了技术难度。

下图是连续频繁的请求触发了平台的保护机制导致目标服务器拒绝访问【403】

GIF动图 ↓:

目标

  • 采集平台:知乎
  • 采集数据:新能源汽车话题
    • 标题
    • 点赞量
    • 作者
  • 使用技术手段(青果代理IP)绕过反爬虫机制
  • 将采集到的数据以文本的格式保存在txt文本中

实战

如发现有错误请指出,谢谢~

开发准备

安装python库requestsBeautifulSoup

使用终端运行

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即可
  • 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小时免费试用活动

感兴趣、有需求的可以点这里进行试用

相关推荐
思则变2 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
漫谈网络3 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
try2find4 小时前
安装llama-cpp-python踩坑记
开发语言·python·llama
泡泡以安5 小时前
安卓高版本HTTPS抓包:终极解决方案
爬虫·https·安卓逆向·安卓抓包
博观而约取5 小时前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector7 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
q567315237 小时前
Java Selenium反爬虫技术方案
java·爬虫·selenium
Zonda要好好学习7 小时前
Python入门Day2
开发语言·python
Vertira7 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉7 小时前
Python之 sorted() 函数的基本语法
python