python爬虫之xpath+多进程爬取百度贴吧实战

文章目录

  • 抓取百度贴吧的某一个帖子的评论内容
    • 前言
    • 先查看贴吧的robots.txt
    • 页面结构分析
      • 评论者头像,用户抓取
      • 评论内容的抓取
      • 评论下回复内容的抓取
    • 源码实现
      • 贴吧抓取过程源码实现
      • 多进程的实现

抓取百度贴吧的某一个帖子的评论内容

前言

本项目实战是用来学习用,没有别的商业用途和恶意请求

先查看贴吧的robots.txt

这是君子协议,如果不允许爬取的,就不去碰,先看君子协议的地址:https://tieba.baidu.com/robots.txt
最后看到,评论内容允许被爬取。
在这里插入图片描述

页面结构分析

  • 抓取的数据结构:
    我们要抓取的评论的内容,评论人的头像,用户名,以及评论人的个人主页,评论时间,回复人信息
  • 页面结构
    通过 css 选择器,评论是位于一个class="p_postlist"的 div下,而p_postlist 下又有多个class 包含l_post j_l_post l_post_bright内容,可以确定评论就在这些 div 中
    在这里插入图片描述

评论者头像,用户抓取

通过页面结构分析,头像是位于 class="d_auth"的 div下元素ul 下,url 的 class="p_author
在这里插入图片描述
所以取头像,用户名的 xpath代码这么写

#头像地址
//ul[@class="p_author"]//a[contains(@class,"p_author_face")]/img/@src# 个人主页的链接
//ul[@class="p_author"]//a[contains(@class,"p_author_face")]/@href# 用户名的链接
//ul[@class="p_author"]//a[contains(@class,"p_author_name")]/text()

评论内容的抓取

在这里插入图片描述

#根据结构,可以去确定内容,子节点的id包含 post_content_就能拿到
//div[contains(@class,"d_post_content_main")]//div[contains(@id,"post_content_")]/text()

评论下回复内容的抓取

根据 xpath 工具看到,都是和评论同一个节点,class="d_post_content_main"的元素下。
在这里插入图片描述

# 评论下的内容
.//div[contains(@class,"d_post_content_main")]//ul[@class="j_lzl_m_w"]

但是在请求的代码中,发现这个 xpath 没有执行,数据没获取到,最后发现是js动态生成的,通过 respons.content的源码发现,这一整个回复的上层 div是空的,这里需要 JS 逆向处理,因为这块涉及到有一定的复杂度,就不再展开,等学完 JS 逆行再来处理。
在这里插入图片描述

源码实现

源码链接:https://gitee.com/allen-huang/python/blob/master/crawler/do-request/bbs/baidu_tieba.py

贴吧抓取过程源码实现

根据xpath结构抓取下来的内容,然后入库到 mongodb 中 去

class BaiduTieba(object):def __init__(self, url):self.url = urlself.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'}passdef rep_content(self):"""获取请求内容@return:"""import requestsresp = requests.get(self.url, headers=self.headers)if resp.status_code == 200:return resp.contentelse:return Nonepassdef parse_content(self):"""解析请求内容@return:"""resp_data = self.rep_content()# 将请求内容转换成 html 内容,并编码为 utf-8html_data = etree.HTML(resp_data, parser=etree.HTMLParser(encoding='utf-8'))# 获取评论的内容comm_list = html_data.xpath('//div[contains(@class,"l_post j_l_post l_post_bright")]')insert_list = []for comm in comm_list:# 取左侧头像的图片链接author_face = comm.xpath('.//ul[@class="p_author"]//a[contains(@class,"p_author_face")]')[0]comm_user_link = author_face.xpath('./@href')[0]comm_face_img = author_face.xpath('./img/@src')[0]# 取左侧头像的用户名comm_name = comm.xpath('.//ul[@class="p_author"]//a[contains(@class,"p_author_name")]/text()')[0]# 取右侧的评论内容comm_content = comm.xpath('.//div[contains(@class,"d_post_content_main")]//div[contains(@id,"post_content_")]/text()')[0]# todo 取右侧的评论时间,这个需要使用 JS 逆向来取一开始以为是 xpath有问题,但在 chrom 浏览器插件上测试是可以的,# todo 在 response.content 上发现这是通过JS来动态取的,所以需要学完 JS 逆向再来处理# comm_time = comm.xpath(#     './/div[contains(@class,"core_reply_tail")]//ul[@class="p_tail"]/li[2]/span/text()')[0]comm_dict = {"comm_user_link": comm_user_link,"comm_face_img": comm_face_img,"comm_name": comm_name,"comm_content": comm_content,"from_url": self.url,# "comm_time": comm_time}# todo 取右侧的回复内容,这个需要使用 JS 逆向来取,先不做处理,等学完 JS 逆向再来处理# reply_list = []# reply_container = comm.xpath('.//div[contains(@class,"d_post_content_main")]//ul[@class="j_lzl_m_w"]')# for reply in reply_container:#     # 取回复人头像的链接#     reply_face = reply.xpath(#         './li[contains(@class,"lzl_single_post")]/a[@class="j_user_card lzl_p_p"]')#     reply_user_link = reply_face.xpath('./@href')#     reply_user_img = reply_face.xpath('./img/@src')#     # 取回复人的名字,回复内容,回复时间#     reply_con = reply.xpath(#         './li[contains(@class,"lzl_single_post")]/div[contains(@class,"lzl_cnt")]')#     reply_name = reply_con.xpath('./a[contains(@class,"j_user_card")]/text()')#     reply_content = reply_con.xpath('./span[contains(@class,"lzl_content_main")]/text()')#     reply_time = reply_con.xpath(#         './div[contains("class="lzl_content_reply")]//span[class="lzl_time"]/text()')##     reply_dict = {#         "reply_user_link": reply_user_link,#         "reply_user_img": reply_user_img,#         "reply_name": reply_name,#         "reply_content": reply_content,#         "reply_time": reply_time#     }#     reply_list.append(reply_dict)##     comm_dict["reply_list"] = reply_listinsert_list.append(comm_dict)return insert_listpassdef insert_data(self, curr_page):insert_list = self.parse_content()if insert_list:res = MongoPool().test.baidu_tieba.insert_many(insert_list)if res.inserted_ids:print(f"第{curr_page}页的数据插入成功")else:print("插入失败")else:pass

多进程的实现

  • 将爬取数据的处理封装成一个执行函数
def main(curr_page):url = "https://tieba.baidu.com/p/7216163538?pn={}".format(curr_page)# 创建一个百度贴吧对象baidu_tieba = BaiduTieba(url)# 调用对象的方法插入到 mongodb中baidu_tieba.insert_data(curr_page)pass
  • 这里是进程池来处理,爬取3页内容
if __name__ == '__main__':TOTAL_PAGE = 3pool = multiprocessing.Pool()pages = range(1, TOTAL_PAGE + 1)# 回调 main函数,pages是迭代器,作为回调函数的参数,这和map函数的用法一样pool.map(main, pages)# 关闭进程池pool.close()# 等待进程池中的进程执行完毕pool.join()

效果图
在这里插入图片描述在这里插入图片描述

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

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

相关文章

操作系统内功篇:硬件结构之CPU是如何执行任务的?

一 CPU是如何读写数据的? 1.1 CPU架构(组成) 当代CPU一般是多核心的,每个核心都有自己的一个L1和L2Cache,L3Cache是一个CPU所有核心共享的,一个CPU只有一个。L1Cache分为数据缓存和指令缓存。 CPU有三层高速缓存的目的就是将Cac…

安装paddle detection心得

一、安装PaddlePaddle conda create -n mypaddle python3.8 conda activate mypaddle python -m pip install paddlepaddle-gpu2.6.0 -i https://mirror.baidu.com/pypi/simple 请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。 这是CUDA1…

Warning logs 2024-03-23

给旧的笔记本安装ubuntu系统,并实现ssh远程连接 1、下载ubuntu系统 ubuntu下载链接 选择带桌面版本 2、准备U盘 3、使用UltraISO制作启动盘 破解UltraISO软件 输入 注册名:王涛 注册码:7C81-1689-4046-626F 使用UltraISO&#xff0c…

RabbitMQ的使用—实战

RabbitMQ的使用—实战 ​ RabbitMQ是一个开源的消息代理中间件,在分布式系统开发中被广泛应用。它实现了高级消息队列协议(AMQP),提供可靠的消息传递、灵活的路由、消息确认等功能。下面是使用RabbitMQ的基本流程: 安…

雷卯推荐超级省电防反接方案

方案特别适合一端电池,一端充电的防反接,特别节能 低VF肖特基电源防反接 此方案采用3颗低压降SKY,相比只用1颗功耗更低,可以防止元器件过热 (两者正常工作损耗对比公式: 1.采用1颗SS34LVFA:…

如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器,并结合cpolar内…

八、C#计数排序算法

简介 计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。 实现原理 首先找出待排序数组中的最大值max和最小值min。 创建一个长度为max-min1的数组count…

IM系统设计之websocket消息转发

Websocket消息转发 项目地址:gitgithub.com:muyixiaoxi/Link.git 上周面试被面试官问到:“在分布式IM系统中,如何实现多个websocket集群之间的通信”。 我在思考了良久后回答:“不会”。 随着我的回答,我和面试官的…

【机器学习入门 】支持向量机

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 前言 支持向量机(Support Vector Machine) 于1995年发表,由于其优越的性能和广泛的适用性,成为机器学习的主流技术&…

阿里云有免费服务器吗?有的,附送免费服务器申请流程

阿里云服务器免费试用申请链接入口:aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用,最高可以免费使用3个月,阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置: 阿里云免费服务器领取 阿里…

day10_面向对象之封装丶构造器

封装概述 现实生活中,每一个个体与个体之间是有边界的,每一个团体与团体之间是有边界的,而同一个个体、团体内部的信息是互通的,只是对外有所隐瞒。 面向对象编程语言是对客观世界的模拟,客观世界里每一个事物的内部…

总结: HQL语句

总结: HQL语句 Part1 数据库的操作Part2 数据表的操作1. 创建普通表2. 内外部表3. 内外部表转换 Part1 数据库的操作 查看数据库: show databases; 创建数据库: create database if not exists 数据库名 使用数据库: use 数据库名; 查看数据库详细信息: desc database 数据库名…

Echarts 利用多X轴实现未来15天天气预报

Echarts 利用多X轴实现未来15天天气预报 UI 设计图 Echarts 实现效果 代码实现 代码分解 echarts 图表上下均显示数据 通过设置 grid.top 和 grid.bottom 设置白天和夜间天气展示区域 grid: {top: 36%,bottom: 36%,left: 5%,right: 5%}, 天气图标的设置 由于 axisLabel 的…

【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

算法 之 排序算法

🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…

leetcode(Hot100)——数组篇

1、两数之和 本题使用哈希法&#xff0c;用一个哈希Map保存数组的值以及对应下标&#xff0c;代码如下&#xff1a; class Solution {public int[] twoSum(int[] nums, int target) {HashMap<Integer,Integer> map new HashMap<>();for(int i0; i<nums.length…

【网络基础】网络层基本协议介绍

目录 一、IP数据包 1.1 网络层的功能 1.2 IP数据包格式 二、ICMP协议介绍 2.1 作用 2.2 常用命令 2.2.1 Ping命令 2.2.2 tracert命令 2.3 广播域 三、ARP协议介绍 3.1 作用 3.2 原理 一、IP数据包 1.1 网络层的功能 定义了基于IP协议的逻辑地址&#xff0c;就是I…

数据结构应用——哈夫曼树

哈夫曼树 哈夫曼树的相关概念构造哈夫曼树基础算法 哈夫曼编码 哈夫曼树的相关概念 结点的权&#xff1a;有某种现实含义的数值。结点的带权路径长度&#xff1a;从树的根结点到该结点的路径长度&#xff08;经过的边数&#xff09;与该结点上权值的乘积。树的带权路径长度&am…

XiBe希贝奶瓶好用吗?2名宝宝的宝爸深度测评分享!

几乎每个新手宝爸宝妈都会有一段时间对孩子的很多东西都是不懂的&#xff0c;一边摸索一边学习。列如关于奶瓶这个问题就困扰不少新手爸妈&#xff0c;特别是面对这么多的品牌的奶瓶完全不知道怎么选。 相信很多新手爸妈都十分担心奶瓶材质安全问题&#xff0c;所以我作为一名…

OpenCV+OpenCV-Contrib源码编译

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、OpenCV是什么&#xff1f;二、OpenCV 源码编译1.前期准备1.1 源码下载1.2 cmake安装1.3 vscode 安装1.4 git 安装1.5 mingw安装 2.源码编译2.1 打开cmake2.…