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

目录

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

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

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

目标

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

实战

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

开发准备

安装python库requestsBeautifulSoup
使用终端运行

pip install requests
pip install bs4

requests: 用于发送HTTP请求
BeautifulSoup: 用于解析HTML数据

代码开发

导入第三方库到代码中

import requests
from bs4 in BeautifulSoup

先获取需要爬取的目标:

url = "https://www.zhihu.com/topic/19731651/hot"

伪装浏览器信息:

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请求:

send_request = requests.get(url,headers=requestHeader)

获取到HTML数据:

HTML_source = send_request.text
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"})		# 获取作者id

使用open函数创建本文文件为后续写入做准备:

text_data = open(r"目录:\爬取数据存放.txt","w",encoding="UTF-8")

创建三个列表为后续写入文本做准备

title_name = []
support_num = []
author_name = []

使用for循环将标题写入列表

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())

将数据写入文本并进行一定的排版(预留一个num充当文本中的编号)

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”列表输出时有空字符串。如下为输出结果

['', '玩车有料', '', '大树', '', '赫尔辛根默斯肯', '', '小权兄弟', '', '产品张小能', '', 'JackyQ', '', '玩车情报局', '', '毅种循环', '', '徐里里', '', '瞻云', '', '叶子豪', '', '太阳城索拉利斯', '', '子乾', '', '南部之星', '', '徐里里', '', '灵活就业engineer', '', '电动姬', '', '人类道德洼地']

2. 发现问题[02]

在运行时有很大概率出现【403】这不仅仅时IP问题。返回的HTML状态码和源码

<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推荐的理由非常简单,在数据采集中可以帮我节省大量时间和精力!!!关键速度贼快!
    • 现在开始使用青果代理绕过反爬虫机制
    • 在这里插入图片描述
    • 在这里插入图片描述
    • 找到分配到的地址和密钥在这里插入图片描述
    • 在代码中配置代理池
# 代理IP隧道域名称:端口号
tunnel = "********.qg.net:*****"

# 用户名密码
username = "******"
password = "********"
proxies = {
    "http": f"http://{username}:{password}@{tunnel}",
    "https": f"http://{username}:{password}@{tunnel}"
}

在请求中添加代理池

send_request = requests.get(url,headers=requestHeader,proxies=proxies)

最终结果

至此采集“知乎”——“新能源汽车”的数据已经完成虽然不是很完善但也七七八八了
来看看最总输出结果吧
在这里插入图片描述

数量: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隧道域名称、端口号、用户名、密码、目录位置 *):

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小时免费试用活动
在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于相机选型的一些参数说明

上一篇&#xff1a;关于相机的一些参数计算&#xff08;靶面、视野等&#xff09; 目录 1.卷帘快门和全局快门1.1 卷帘快门1.2 全局快门PS&#xff1a;视觉伺服与快门选择 2.黑白和彩色3.CCD和CMOS3.1 CCD3.2 CMOSCCD VS CMOS 4.面阵和线扫4.1 面阵4.2 线扫4.3 面阵 VS 线扫 5.…

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本&#xff08;我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 &#xff09; 进入到控制台&#xff0c;添加helm仓库 如果你想不改任何配置&#xff0c;你可以执行安装命令&#xff0c;等待安装即可helm instal…

React (三)

文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…

win10局域网加密共享设置

1、创建共享账户 我的电脑右键选择管理 选择本地用户和组 -> 用户 双击用户 在空白区域右键,新建用户 然后创建用户 点击创建后 2、设置网络 右下角网络右键

如何从 VMware 官网下载最新版本的 VMware Workstation

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 下载VMware 📒📝 操作步骤🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾尝试从 VMware 官网下载 VMware Workstation,但总是被繁杂的选择和复杂的操作困扰?VMware 提供的产品种类繁多,而且官网页面设计复…

服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 两组分别由4块SAS硬盘组建的raid5阵列&#xff0c;两组阵列划分的LUN组成LVM架构&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线。热备盘自动上线替换离线硬盘&#xff0c;但在热备盘上线同步数据…

机械设计学习资料

免费送大家学习资源&#xff0c;已整理好&#xff0c;仅供学习 下载网址&#xff1a; https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip

Proteus 8.17的详细安装教程

通过百度网盘分享的文件&#xff1a;Proteus8.17(64bit&#xff09;.zip 链接&#xff1a;https://pan.baidu.com/s/1zu8ts1Idhgg9DGUHpAve7Q 提取码&#xff1a;8q8v 1.右击【Proteus8.17(64bit&#xff09;.zip】&#xff0c;选择【全部解压缩......】。 &#xff0c; 2.…

qt添加模块

以QtNetwork模块为例 方式一 扩展-qt vs tools-qt project settings 方式二 右键选中项目-属性-qt project settings 方法三 在此界面选择select modules,即可进行相应模块添加

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道&#xff0c;微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732&#xff0c;更新后&#xff0c;系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间&#xff0c;文件资源管理器窗口很小时搜索框被切…

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述&#xff1a;字体变成方块 原因&#xff1a;字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源&#xff08;蓝色的大F&#xff09; 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…

Python中“暂停”(time.sleep?input?)

input函数最是经典&#xff0c;在多种实现中简单粗暴单纯而经济。 (笔记模板由python脚本于2024年11月22日 10:58:38创建&#xff0c;本篇笔记适合比较熟悉python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大…

SpringMVC 执行流程详解

目录 前言1. SpringMVC 的核心组件概述1.1 DispatcherServlet1.2 HandlerMapping1.3 HandlerAdapter1.4 拦截器&#xff08;HandlerInterceptor&#xff09;1.5 ViewResolver 2. SpringMVC 的执行流程详解2.1 接收请求并分发2.2 获取 HandlerExecutionChain2.3 获取 HandlerAda…

扩散模型从原理到实战 入门

diffusion-models-class-CN/unit1/README_CN.md at main darcula1993/diffusion-models-class-CN GitHub 你可以使用命令行来通过此令牌登录 (huggingface-cli login) 或者运行以下单元来登录&#xff1a; from huggingface_hub import notebook_loginnotebook_login() http…

企业信息化-走进身份管理之搭建篇

​一、身份管理是什么 我们先要弄懂统一身份管理到底是什么&#xff1f; 统一身份管理&#xff08;Unified Identity Manager&#xff0c;UIM&#xff09;&#xff0c;身份管理&#xff08;Identity Management&#xff0c;简称IDM&#xff09;&#xff0c;也被称为IAM&#…

周期法频率计的设计

目录 周期法频率计 分析&#xff1a; 设计过程&#xff1a; 周期法频率计 对于低频信号&#xff0c;应用周期法进行测频。周期法测频的基本原理是&#xff1a;应用标准频率信号统计被测信号两个相邻脉冲之间的脉冲数&#xff0c;然后通过脉冲数计算出被测信号的周期&#xff…

C语言--分支循环编程题目

第一道题目&#xff1a; #include <stdio.h>int main() {//分析&#xff1a;//1.连续读取int a 0;int b 0;int c 0;while (scanf("%d %d %d\n", &a, &b, &c) ! EOF){//2.对三角形的判断//a b c 等边三角形 其中两个相等 等腰三角形 其余情…

MySQL Join 的原理与优化实践

文章目录 引言一、基础准备&#xff1a;创建环境与示例数据1. 初始化示例表2. 示例 Join 查询3. EXPLAIN 输出分析 二、MySQL Join 的核心算法与执行机制1. 三种 Join 算法的实现与原理1.1 Index Nested-Loop Join&#xff08;INLJ&#xff09;1.2 Simple Nested-Loop Join&…

关于安卓模拟器或手机设置了BurpSuite代理和安装证书后仍然抓取不到APP数据包的解决办法

免责申明 本文仅是用于学习研究安卓系统设置代理后抓取不到App数据包实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一…

飞凌嵌入式旗下教育品牌ElfBoard与西安科技大学共建「科教融合基地」

近日&#xff0c;飞凌嵌入式与西安科技大学共同举办了“科教融合基地”签约揭牌仪式。此次合作旨在深化嵌入式创新人才的培育&#xff0c;加速科技成果的转化应用&#xff0c;标志着双方共同开启了一段校企合作的新篇章。 出席本次签约揭牌仪式的有飞凌嵌入式梁总、高总等一行…