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.rhkb.cn/news/283840.html

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

相关文章

xercesc库中文保存XML功能实现

目录 一 参考链接 二 运行结果 三 代码 一 参考链接 DOM Programming Guide (apache.org) Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客 Xerces-c库的使用-CSDN博客 二 运行结果 三 代码 #if 1//参考链接: https://blog.csdn.net/RGBMa…

VUE3.0(一):vue3.0简介

Vue 3 入门指南 什么是vue Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界…

租用阿里云2核2G服务器配置报价,61元和99元

阿里云2核2G服务器配置优惠价格61元和99元,61元是轻量应用服务器2核2G3M带宽、50G高效云盘,99元服务器是ECS云服务器经济型e实例2核2G、3M固定带宽、40G ESSD entry 系统盘。活动 aliyunfuwuqi.com/go/aliyun 阿里云服务器网aliyunfuwuqi.com根据上面的官…

如何减少pdf的文件大小?pdf压缩工具介绍

文件发不出去,有时就会耽误工作进度,文件太大无法发送,这应该是大家在发送PDF时,常常会碰到的问题吧,那么PDF文档压缩大小怎么做呢?因此我们需要对pdf压缩后再发送,那么有没有好用的pdf压缩工具…

1、goreplay流量回放

目的 在实际项目中,会有大量的回归测试工作,通常会使用自动化代码的手段来实现回归,但是对于一个庞大的系统来说,通过自动化脚本的方式来实现回归测试,又显得很费时费力。并且如果有定期将线上数据同步到测试环境的需求…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

uni-app打包证书android

Android平台打包发布apk应用,需要使用数字证书(.keystore文件)进行签名,用于表明开发者身份。 Android证书的生成是自助和免费的,不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…

YOLOv5全网首发改进: 注意力机制改进 | 上下文锚点注意力(CAA) | CVPR2024 PKINet 遥感图像目标检测

💡💡💡本文独家改进:引入了CAA模块来捕捉长距离的上下文信息,利用全局平均池化和1D条形卷积来增强中心区域的特征,从而提升检测精度,CAA和C3进行结合实现二次创新,改进思路来自CVPR2024 PKINet,2024年前沿最新改进,抢先使用 💡💡💡小目标数据集,涨点近两个…

云原生相关知识

一、kubernetes 1 概述 Kubernetes(也称 k8s 或 “kube”)是一 个​​开源​​的容器编排平台,可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。 我们常说的编排的英文单词为 “Orchestration”,它常被解释…

Git 分布式版本控制系统基本概念和操作命令

目录 Git 基本概念 功能特点 工作流程 操作命令 新建代码库 配置 增删文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 小结 Git Git 是一个开源的分布式版本控制系统,用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计,用于…

结构体内存对齐 offsetof 枚举 联合体

文章目录 结构体结构体内存对齐结构体嵌套结构体内存对齐的原因修改默认对齐数设置默认对齐数 #pragma pack() offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。 结构体传参值传递地址传递 位段枚举联合 联合体 共用体联合体大…

4 种策略让 MySQL 和 Redis 数据保持一致

先阐明一下 MySQL 和 Redis 的关系:MySQL 是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis 是用来当缓存,用来提升数据访问的性能。 关于如何保证 MySQL 和 Redis 中的数据一致(即缓存一致性问题…

Windows下安装QT,遇到下载组件中没有指定版本(提供解决方式) + 5.15详细安装步骤版

Windows下安装QT 5.15详细安装问题详解 前情提要一、QT 5.15及之后版本的下载问题二、QT 5.15及之后版本的下载方式&#xff1a;下载QT(在线安装版本)三、详细安装步骤遇到<下载组件>中没有指定版本的解决方式 前情提要 嵌入式设备搭载的QT版本是5.15&#xff0c;所以PC…

C语言技能数(知识点汇总)

C语言技能数&#xff08;知识点汇总&#xff09; C 语言概述特点不足之处 标准编程机制 数据类型变量数据类型字符类型整数类型符号位二进制的原码、反码和补码 浮点类型布尔类型 常量字面常量const 修饰的常变量#define定义的标识符常量枚举常量 sizeofsizeof(结构体)不要对 v…

【Godot4.2】 基于SurfaceTool的3D网格生成与体素网格探索

概述 说明&#xff1a;本文基础内容写于2023年6月&#xff0c;由三五篇文章汇总而成&#xff0c;因为当时写的比较潦草&#xff0c;过去时间也比较久了&#xff0c;我自己都得重新阅读和理解一番&#xff0c;才能知道自己说了什么&#xff0c;才有可能重新优化整理。 因为我对…

【计算机网络】常见面试题汇总

文章目录 1.计算机网络基础1.1网络分层模型/OSI七层模型是什么&#xff1f;1.2TCP/IP四层模型是什么&#xff1f;每一层的作用&#xff1f;1.2.1TCP四层模型&#xff1f;1.2.2为什么网络要分层&#xff1f; 1.2常见网络协议1.2.1应用层常见的协议1.2.2网络层常见的协议 2.HTTP2…

动态规划——斐波那契问题(Java)

目录 什么是动态规划&#xff1f; 练习 练习1&#xff1a;斐波那契数 练习2&#xff1a;三步问题 练习3&#xff1a;使用最小花费爬楼梯 练习4&#xff1a;解码方法 什么是动态规划&#xff1f; 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&…

锂电池寿命预测 | Matlab基于ALO-SVR蚁狮优化支持向量回归的锂离子电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于ALO-SVR蚁狮优化支持向量回归的锂离子电池剩余寿命预测 基于蚁狮优化和支持向量回归的锂离子电池剩余寿命预测: 1、提取NASA数据集的电池容量&#xff0c;以历史容量作为输入&#xff0c;…

电脑安装双系统windows和ubuntu server

1.创建Ubuntu-server的启动盘 首先要从官网下载Ubuntu-server18.04的ISO文件&#xff0c;用rufs烧录到U盘。如下所示 2. 磁盘分区 在windows创建两个盘&#xff08;linuxboot 和linuxroot&#xff09;&#xff0c;后面一个一个用于boot&#xff0c;一个用于root. 3.开机U盘启…

AI开源概览及工具使用

一、前言 随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效&#xff1b; 关联资源&#xff1a;代码 GitHub、相关论文、项目Demo、产品文档、Grok Ai、gr…