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

news2024/11/28 2:59:39

目录

  • 反爬虫的本意和其带来的挑战
  • 目标
  • 实战
    • 开发准备
    • 代码开发
    • 发现问题
      • 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小时免费试用活动
在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot-vue excel上传导出

数据库 device_manage表 字段&#xff0c;id&#xff0c;workshop,device_number,device_name,device_model,warn_time,expired_time device_warn表 字段&#xff0c;id,warn_time,expired_time 后端 实体类格式 device_manage Data TableName("device_manage"…

【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)

javascript调用本地exe程序 详细操作步骤结果 详细操作步骤 在本地创建一个txt文件依次输入 1.指明所使用注册表编程器版本 Windows Registry Editor Version 5.00这是脚本的第一行&#xff0c;指明了所使用的注册表编辑器版本。这是必需的&#xff0c;以确保脚本能够被正确解…

Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)

目录 一、Zset有序集合类型介绍 二、常见命令 1、ZADD 2、ZCARD 3、ZCOUNT 4、ZRANGE 5、ZREVRANGE 6、ZRANGEBYSCORE 7、ZREVRANGEBYSCORE 8、ZPOPMAX 9、ZPOPMIN 10、ZRANK 11、ZREVRANK 12、ZSCORE 13、ZREM 14、ZREMRANGEBYRANK 15、ZREMRANGEBYSCORE 16…

设计模式之 责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在将多个处理对象通过链式结构连接起来&#xff0c;形成一条处理请求的链条。每个处理对象都有机会处理请求&#xff0c;或者将请求传递给链中的下一个对象。这样&#x…

新版布谷直播软件源码开发搭建功能更新明细

即将步入2025年也就是山东布谷科技专注直播系统开发,直播软件源码出售开发搭建等业务第9年,山东布谷科技不断更新直播软件功能&#xff0c;以适应当前新市场环境下的新要求。山东布谷科技始终秉承初心&#xff0c;做一款符合广大客户需求的直播系统软件。支持广大客户提交更多个…

VITE+VUE3+TS环境搭建

前言&#xff08;与搭建项目无关&#xff09;&#xff1a; 可以安装一个node管理工具&#xff0c;比如nvm&#xff0c;这样可以顺畅的切换vue2和vue3项目&#xff0c;以免出现项目跑不起来的窘境。我使用的nvm&#xff0c;当前node 22.11.0 目录 搭建项目 添加状态管理库&…

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色…

英伟达推出了全新的小型语言模型家族——Hymba 1.5B

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

低速接口项目之串口Uart开发(二)——FIFO实现串口数据的收发回环测试

本节目录 一、设计思路 二、loop环回模块 三、仿真模块 四、仿真验证 五、上板验证 六、往期文章链接本节内容 一、设计思路 串口数据的收发回环测试&#xff0c;最简单的硬件测试是把Tx和Rx连接在一起&#xff0c;然后上位机进行发送和接收测试&#xff0c;但是需要考虑到串…

《Java核心技术I》树集

树集 TreeSet类与散列类似&#xff0c;树集是一个有序集合(sorted collection)。 可以以任意顺序将元素插入到集合中&#xff0c;遍历集合时&#xff0c;自动按照排序后的顺序呈现。 插入5个字符串&#xff0c;访问添加的元素 package treeSet;import java.util.TreeSet;pu…

Tailwind CSS v4.0 开启

Tailwind CSS v4.0 发布了 Tailwind CSS 是一个为快速开发而精心设计的原子类 CSS 框架&#xff0c;它提供了充满设计感和应用程序至上的能力来创建组件&#xff0c;它在最新的 2.0 版本中加入了暗黑模式&#xff0c;开箱即用。 Tailwind Connect 大会上&#xff0c;与会者抢先…

QML TableView 实例演示 + 可能遇到的一些问题(Qt_6_5_3)

一、可能遇到的一些问题 Q1&#xff1a;如何禁用拖动&#xff1f; 在TableView下加一句代码即可&#xff1a; interactive: false 补充&#xff1a;这个属性并不专属于TableView&#xff0c;而是一个通用属性。很多Controls下的控件都可以使用&#xff0c;其主要作用就是控…

详细描述一下Elasticsearch更新和删除文档的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch更新和删除文档的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch更新和删除文档的过程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 E…

(五)Ubuntu22.04+Stable-Diffusion-webui AI绘画 模型转换插件安装及其使用

一、说明 这是秋叶大佬开发的一个模型转换插件&#xff0c;秋叶整合包中自带。如果你的 Stable Diffusion WebUI 中没有这个插件&#xff0c;请使用下面这个地址安装&#xff0c;安装完成之后别忘了重启 WebUI。 模型转换插件 https://github.com/Akegarasu/sd-webui-model-c…

Python数据分析实例五、US 大选捐款数据分析

美国联邦选举委员会 (FEC) 公布了对政治竞选活动的贡献数据。这包括投稿人姓名、职业和雇主、地址和投款金额。2012 年美国总统大选的贡献数据以单个 150 MB 的 CSV 文件P00000001-ALL.csv形式提供,该文件可以通过以下pandas.read_csv加载: import pandas as pdfec = pd.r…

原生微信小程序画表格

wxml部分&#xff1a; <view class"table__scroll__view"><view class"table__header"><view class"table__header__item" wx:for"{{TableHeadtitle}}" wx:key"index">{{item.title}}</view></…

TCP/IP协议攻击与防范

一、TCP/IP协议攻击介绍 1.1 Internet的结构​ LAN&#xff1a;局域网 WAN&#xff1a;广域网 WLAN&#xff1a;无线局域网 私有IP地址与公有IP地址&#xff1f; 私有地址&#xff1a;A类&#xff1a;10.0.0.0~10.255.255.255 B类&#xff1a;172.16.0.0~172.31.255.255…

微信小程序2-地图显示和地图标记

一、index修改页面&#xff0c;让页面能够显示地图和一个添加标记的按钮。 index.wxml <scroll-view class"scrollarea" scroll-y type"list"><view class"index_container"><map id"map" style"width: 100%; h…

【C++】从C语言到C++学习指南

如果你也是从C语言一路过来的&#xff0c;那么请一起看下去吧&#xff01; 文章目录 面型对象程序设计C基础C和C一些语法区别C在非对象方面对C语言的扩充C的一些标准&#xff08;兼容旧标准&#xff09; 首先&#xff0c;在C的学习中&#xff0c;我们要时刻清醒一点&#xff1…

Fakelocation Server服务器/专业版 ubuntu

前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu&#xff08;安装下载不再赘述&#xff09; sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…