爬虫实战:采集知乎XXX话题数据
目录
- 反爬虫的本意和其带来的挑战
- 目标
- 实战
- 开发准备
- 代码开发
- 发现问题
- 1. 发现问题[01]
- 2. 发现问题[02]
- 解决问题
- 1. 解决问题[01]
- 2. 解决问题[02]
- 最终结果
- 结语
反爬虫的本意和其带来的挑战
在这个数字化时代社交媒体已经成为人们表达观点的重要渠道,对企业来说,监控社交媒体上的舆情动态可以提供宝贵的数据支持以帮助优化产品和服务。对个人来说,可以通过监控分析相关话题,来了解行业趋势、扩展知识面从而更好的进行规划。然而目前的很多社交媒体都有相当完善的反爬虫机制(例如:IP封禁),虽然它的本意是为了保护自身(例如:恶意的爬虫攻击(DOS)高速频繁的请求会增加目标平台的服务器负担【503】),但是对于合法的、低频率的采集任务增加了技术难度。
下图是连续频繁的请求触发了平台的保护机制导致目标服务器拒绝访问【403】
GIF动图 ↓:
目标
- 采集平台:知乎
- 采集数据:新能源汽车话题
- 标题
- 点赞量
- 作者
- 使用技术手段(青果代理IP)绕过反爬虫机制
- 将采集到的数据以文本的格式保存在txt文本中
实战
如发现有错误请指出,谢谢~
开发准备
安装python库requests
、BeautifulSoup
使用终端运行
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+=1text_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+=1text_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小时免费试用活动:
感兴趣、有需求的可以点这里进行试用
相关文章:

爬虫实战:采集知乎XXX话题数据
目录 反爬虫的本意和其带来的挑战目标实战开发准备代码开发发现问题1. 发现问题[01]2. 发现问题[02] 解决问题1. 解决问题[01]2. 解决问题[02] 最终结果 结语 反爬虫的本意和其带来的挑战 在这个数字化时代社交媒体已经成为人们表达观点的重要渠道,对企业来说&…...

大数据新视界 -- Hive 数据桶原理:均匀分布数据的智慧(上)(9/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【小白学机器学习33】 大数定律python的 pandas.Dataframe 和 pandas.Series基础内容
目录 0 总结 0.1pd.Dataframe有一个比较麻烦琐碎的地方,就是引号 和括号 0.2 pd.Dataframe关于括号的原则 0.3 分清楚几个数据类型和对应的方法的范围 0.4 几个数据结构的构造关系 list → np.array(list) → pd.Series(np.array)/pd.Dataframe 1 python 里…...

【shodan】(五)网段利用
shodan基础(五) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 nsa ip address range www.nsa.gov需科学上网 搜索网段 shodan s…...

LeetCode739. 每日温度(2024冬季每日一题 15)
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: 输入: temperatu…...

Node.js的http模块:创建HTTP服务器、客户端示例
新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块,只需要在文件中通过require(http)引入即可。…...

加菲工具 - 好用免费的在线工具集合
加菲工具 https://orcc.online AI 工具 加菲工具 集合了目前主流的,免费可用的ai工具 文档处理 加菲工具 pdf转word、office与pdf互转等等工具都有链接 图片图标 加菲工具 统计了好用免费的在线工具 编码解码 加菲工具 base64编码解码、url编码解码、md5计算…...

.NET9 - 新功能体验(二)
书接上回,我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中,引入的一项新的泛型约束功能,允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观,简单来说就是Span、ReadO…...

map和redis关系
Map 和 Redis 都是用于存储和管理数据的工具,但它们在用途、实现和应用场景上有所不同。下面详细解释 Map 和 Redis 之间的关系和区别。 1. Map 数据结构 定义 Map 是一种数据结构,用于存储键值对(key-value pairs)。每个键都是…...

《数据结构》学习系列——图(中)
系列文章目录 目录 图的遍历深度优先遍历递归算法堆栈算法 广度优先搜索 拓扑排序定义定理算法思想伪代码 关键路径基本概念关键活动有关量数学公式伪代码时间复杂性 图的遍历 从给定连通图的某一顶点出发,沿着一些边访问遍图中所有的顶点,且使每个顶点…...

探索Python的HTTP之旅:揭秘Requests库的神秘面纱
文章目录 **探索Python的HTTP之旅:揭秘Requests库的神秘面纱**第一部分:背景介绍第二部分:Requests库是什么?第三部分:如何安装Requests库?第四部分:Requests库的五个简单函数使用方法第五部分&…...

Python 爬虫从入门到(不)入狱学习笔记
爬虫的流程:从入门到入狱 1 获取网页内容1.1 发送 HTTP 请求1.2 Python 的 Requests 库1.2 实战:豆瓣电影 scrape_douban.py 2 解析网页内容2.1 HTML 网页结构2.2 Python 的 Beautiful Soup 库 3 存储或分析数据(略) 一般爬虫的基…...

IDEA优雅debug
目录 引言一、断点分类🎄1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧🎉3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…...

wp the_posts_pagination 与分类页面搭配使用
<ul> <?php while( have_posts() ) : the_post(); <li > <a href"<?php the_permalink(); ?>"> <?php xizhitbu_get_thumbnail(thumb-pro); ?> </a> <p > <a href&q…...

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!
在Python开发中,字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中,split()函数无疑是最为重要和常用的一个。无论你是Python新手,还是经验丰富的开发者,深入理解并熟练运用split()方法,都将大大提升…...

免费实用在线AI工具集合 - 加菲工具
免费在线工具-加菲工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/h…...

正则表达式灾难:重新认识“KISS原则”的意义
RSS Feed 文章标题整理 微积分在生活中的应用与思维启发 捕鹿到瞬时速度的趣味探索 微积分是一扇通往更广阔世界的门,从生活中学习思维的工具。 数据库才是最强架构 你还在被“复杂架构”误导吗? 把业务逻辑写入数据库,重新定义简单与效率。…...

eNSP-缺省路由配置
缺省路由是一种特殊的静态路由,其目的地址为0.0.0.0,子网掩码为0.0.0.0。 1.拓扑图搭建 2.配置路由器 AR2 <Huawei>sys #进入系统视图 [Huawei]ip route-static 0.0.0.0 0.0.0.0 192.168.3.2 #设置缺省路由 [Huawei]q #返回上一层 <Huawe…...

solr 远程命令执行 (CVE-2019-17558)
漏洞描述 Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。 Apa…...

STM32端口模拟编码器输入
文章目录 前言一、正交编码器是什么?二、使用步骤2.1开启时钟2.2配置编码器引脚 TIM3 CH1(PA6) CH2 (PA7)上拉输入2.3.初始化编码器时基2.4 初始化编码器输入2.5 配置编码器接口2.6 开启定时器2.7获取编码器数据 三、参考程序四、测试结果4.1测试方法4.2串口输出结果…...

Centos 8, add repo
Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han...

MYSQL- 查看存储过程调式信息语句(二十七)
13.7.5.27 SHOW PROCEDURE CODE 语句 SHOW PROCEDURE CODE proc_name此语句是MySQL扩展,仅适用于已构建有调试支持的服务器。它显示了命名存储过程的内部实现的表示。类似的语句SHOW FUNCTION CODE显示有关存储函数的信息(见第13.7.5.19节“SHOW FUNTIO…...

C#基础上机练习题
21.计算500-800区间内素数的个数cn,并按所求素数的值从大到小的顺序排列,再计算其间隔加、减之和,即第1个素数-第2个素数第3个素数-第4个素数第5个素数……的值sum。请编写函数实现程序的要求,把结果cn和sum输出。 22.在三位整数…...

5.5 W5500 TCP服务端与客户端
文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端: 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。绑定套接字[bind]:服务器将…...

一区北方苍鹰算法优化+创新改进Transformer!NGO-Transformer-LSTM多变量回归预测
一区北方苍鹰算法优化创新改进Transformer!NGO-Transformer-LSTM多变量回归预测 目录 一区北方苍鹰算法优化创新改进Transformer!NGO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab NGO-Transformer-LST…...

深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
MyBatis 是目前 Java 开发中常用的一种 ORM(对象关系映射)框架,它不仅简化了 SQL 语句的编写和管理,还提供了强大的缓存机制,用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存,分别应用于不…...

移远通信推出全新5G RedCap模组RG255AA系列,以更高性价比加速5G轻量化大规模商用
11月20,全球领先的物联网整体解决方案供应商移远通信宣布,正式推出其全新5G RedCap模组RG255AA系列。该系列模组支持5G NR独立组网(SA)和LTE Cat 4双模通信,具有高性能高集成度、低功耗、小尺寸、高性价比等优势&#…...

架构-微服务-环境搭建
文章目录 前言一、案例准备1. 技术选型2. 模块设计3. 微服务调用 二、创建父工程三、创建基础模块四、创建用户微服务五、创建商品微服务六、创建订单微服务 前言 微服务环境搭建 使用的电商项目中的商品、订单、用户为案例进行讲解。 一、案例准备 1. 技术选型 maven&a…...

conda下载与pip下载的区别
一、conda下载与pip下载的区别 最重要是依赖关系: pip安装包时,尽管也对当前包的依赖做检查,但是并不保证当前环境的所有包的所有依赖关系都同时满足。 当某个环境所安装的包越来越多,产生冲突的可能性就越来越大。conda会检查当…...