爬虫简单实操2——以贴吧为例爬取“某吧”前10页的网页代码

需求是将贴吧的【某个吧】里面【n页】的网页代码爬取下来,保存至本地

首先我们要思考这个贴吧爬虫的框架,要有方法可以构造url列表(就可以一次获取多个url),能请求获取相应,能把html保存到本地。

import requestsclass TiebaSpider(object): # 初始化核心组件def __init__(self):  ....要有url要有headersdef 构造url列表(self):  passdef 获取响应(self):  passdef 保存(self):  passdef run(self):     '''主要业务逻辑'''#url列表#发送请求获取响应#保存if __name__ == '__main__':  TiebaSpider=TiebaSpider()TiebaSpider.run()



一、初始化核心组件

找到贴吧某个吧【lol吧】的url: https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=450
pn是确定页面的参数,450/50=9,0是第1页,9是第10页。怎么获取【贴吧名字】,实例化对象的时候把参数写里面去,然后在初始化方法里面,加上tieba_name去获取传的名字。

#将变量 tieba_name 绑定到当前类的实例上,使其成为实例变量,作用域贯穿实例的生命周期
self.tieba_name = tieba_name self.start_url = 'https://tieba.baidu.com/f?kw='+tieba_name+'&ie=utf-8&pn={}'self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}



二、构造存放url列表的函数

需要构建一个空列表url_list = [] ,用来保存这10页的 url ,这些url的参数是需要我们提供的,并且拼接起来,所以要思考怎么获取【页数】,每一页是50条数据,所以第1页是050,第2页是150,依次类推用到range()方法,range是从0开始的,然后每一条的页数信息也拼接上,url就完整了。

format()的基本功能作用:将变量值填充到字符串的{}占位符中。

def get_url_list(self):# 构造URL列表url_list = []for i in range(10): #循环10次,也就是10页url_list.append(self.start_url.format(i*50))                                                        # print(url_list)  #检测url写对没return url_list  #然后返回url_list

run()函数里面也要调用这个 get_url_list()函数,把返回的url_list的值保存到变量url_list里面

#构造URL列表
url_list = self.get_url_list() #调用所以这个列表会保存到url_list里面



三、构造发送请求获取响应的函数

想要得到响应,用到的就是requests.get(url)方法,保存到response变量里面,用response.text 或者 response.content.decode()获取网页源代码内容【也就是html】,那我们的url怎么得到并能在这个函数里面使用?就需要在这个构造函数里面加一个参数url。

	def parse_url(self,url):print(url)# 发送请求,得到响应response = requests.get(url,headers=self.headers)response.encoding = 'utf-8'return response.text  #返回的值是网页代码

并且在run()里面要先循环存入 url_list 里面真实的 url 到 for循环的 变量url 里面,存的就是通过response.text获得的html代码,所以调用方法parse_url()保存到名为html的变量里面

#遍历 发送请求获取响应for url in url_list:  #循环列表里元素个数的次数,然后每次把列表里面的元素按顺序赋值给urlhtml = self.parse_url(url) #调用此方法传参url,所以方法里面要接受url,参数要加上url# print(html)page_num = url_list.index(url) + 1  #index()前面的对象要是列表,url只是列表里面的一个元素,是一个str类型

这个时候其实还没思考怎么传页数,后面再回头写page_num。现在也可以浅浅分析一下:因为在后面保存的时候,我需要页面的参数来命名【tieba_name-第i页.html】,所以这里的列表索引可以作为页数,比定义一个page_num = 0,然后用for…range 循环保存页数要高级,代码量也少些。index下标是从0开始,所以第1页就是 url_list.index(url) + 1 。注意index()括号里面写的是列表里面的这个元素对应的下标,所以括号里面是变量url。



四、构造保存html的函数

保存的时候我要知道【贴吧名】,【网页源代码】和【页数】,所以要把这些参数获取到。而【贴吧名 self.tieba_name】是初始化里面加了self.的实例变量,可以在任何构造函数里面使用或修改,故不需要在函数里传参(不需要在括号里面写参数名)。在函数括号里面加上【网页源代码】和【页数】这两个参数名即可。

补充:实例变量(self.变量名):
通过 self.变量名 定义的变量属于当前实例,作用域贯穿实例的生命周期。	  
其他方法也可以通过 self.变量名 访问或修改它。

保存的HTML名字是这个类型:“ tieba_name-第i页.html ”

def save_html(self,html,page_num):# 保存 tieba_name-第i页.htmlwith open(self.tieba_name+'-第'+str(page_num)+'页.html','w',encoding='utf-8') as f:f.write(html)

run() 方法里也要调用 save_html() 方法,因为 save_html() 方法 里面要获取【网页源代码】和【页数】,所以我们在调用 save_html() 方法 时候要传入 html , page_num 两个参数。

#保存
self.save_html(html,page_num) #调用此方法传参html,所以方法里面要接受html,参数要加上html。然后把page_num传给save_html()方法



五、爬虫整体代码


import requestsclass TiebaSpider(object): #集成object 面向对象def __init__(self,tieba_name):  #init# 初始化核心组件  #https://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=450   pn是页面,一页50条self.tieba_name = tieba_name  #这样才可以在别的方法里使用到传过来的tieba_name,以 self.tieba_name 变量来使用self.start_url = 'https://tieba.baidu.com/f?kw='+tieba_name+'&ie=utf-8&pn={}'self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}def get_url_list(self):# 构造URL列表'''url_list = []for i in range(10): #10次10页url_list.append(self.start_url.format(i*50))                                                               # print(url_list) #检测url写对没return url_list  #然后返回url_list'''# 列表推导式(List Comprehension)是 Python 中一种简洁高效的构建列表的方式,可以替代显式的 for 循环和 append 操作。想要看结果也可以把推导式保存至变量,然后print出来return [self.start_url.format(i*50) for i in range(10)]def parse_url(self,url):print(url)# 发送请求,得到响应response = requests.get(url,headers=self.headers)response.encoding = 'utf-8'return response.text  #返回的值是网页代码def save_html(self,html,page_num):# 保存 tieba_name-第i页.html# print(page_num)with open(self.tieba_name+'-第'+str(page_num)+'页.html','w',encoding='utf-8') as f:f.write(html)def run(self):     #run方法'''主要业务逻辑'''#构造URL列表url_list = self.get_url_list() #调用所以这个列表会保存到url_list里面#遍历 发送请求获取响应for url in url_list:  #循环列表里元素个数的次数,然后每次把列表里面的元素按顺序赋值给urlhtml = self.parse_url(url) #调用此方法传参url,所以方法里面要接受url,参数要加上url# print(html)page_num = url_list.index(url) + 1  #index()前面的对象要是列表,url只是列表里面的一个元素,是一个str类型#保存self.save_html(html,page_num) #调用此方法传参html,所以方法里面要接受html,参数要加上html。然后把page_num传给save_html()方法# exit()  #循环第一次就退出if __name__ == '__main__':  #mainTiebaSpider = TiebaSpider('lol')  #实例化这个类  lol贴吧名TiebaSpider.run()

最终点击html实现的效果,动手尝试一下吧!
在这里插入图片描述

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

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

相关文章

webpack5 css-loader 配置项中的modules

在 Webpack 的 css-loader 中,modules 选项是一个核心配置,它直接关系到 CSS 的模块化处理方式。下面从概念、原理、使用场景和实践技巧四个方面详细解析: 概念解析:CSS Modules 是什么? CSS Modules 是一种让 CSS 类…

springboot+Vue驾校管理系统

概述 基于springbootVue开发的驾校管理系统。该系统采用主流技术栈开发,功能完善,既包含用户端便捷的操作界面,又具备强大的后台管理功能。 主要内容 一、用户端功能模块 ​​核心功能导航​​: 首页展示驾校推荐信息及最新动态…

#华为鲲鹏#华为计算#鲲鹏开发者计划2025#

#华为鲲鹏#华为计算#鲲鹏开发者计划2025# <新版开发者计划>的内容链接&#xff1a;鲲鹏开发者计划2025-鲲鹏社区 通过学习毕昇编译器整体介绍&#xff0c;以及安装使用流程、新增特性、调优工具的使用及相关指导文件获取&#xff0c;对毕异编译器有了更深的认识。 我刚…

小程序学习笔记:声明式导航的多种玩法

在小程序开发中&#xff0c;页面导航是实现用户流畅交互体验的关键环节。今天&#xff0c;咱们就一起来深入学习小程序里通过声明式导航实现页面跳转、切换 tab 页、后退等功能的技巧&#xff0c;还会附上详细代码示例&#xff0c;让大家轻松掌握&#xff01; 一、什么是页面导…

Linux中《动/静态库原理》

目录 目标文件ELF文件ELF从形成到加载轮廓ELF形成可执行readelf命令ELF可执行文件加载 理解连接与加载静态链接ELF加载与进程地址空间虚拟地址/逻辑地址 重新理解进程虚拟地址空间 动态链接与动态库加载进程如何看到动态库进程间如何共享库的动态链接动态链接到底是如何工作的&…

Android大图加载优化:BitmapRegionDecoder深度解析与实战

在移动端开发中&#xff0c;超大图片加载一直是性能优化的难点。本文将深入剖析BitmapRegionDecoder原理&#xff0c;提供完整Kotlin实现方案&#xff0c;并分享性能调优技巧。 一、为什么需要大图加载优化&#xff1f; 典型场景&#xff1a; 医疗影像&#xff1a;2000015000…

基于ApachePOI实现高德POI分类快速导入PostgreSQL数据库实战

目录 前言 一、高德POI分类简介 1、数据表格 2、分类结构 二、从Excel导入到Postgresql 1、Excel解析流程 2、Mybatis批量导入 3、数据入库 三、总结 前言 在大数据与地理信息深度交融的当下&#xff0c;地理信息系统&#xff08;GIS&#xff09;的触角已延伸至各个领域…

如何打造Apache Top-Level开源时序数据库IoTDB

引言 数据与时间结合后&#xff0c;便拥有了生命。在金融、系统日志、工业产线和智能设备等领域&#xff0c;时序数据每毫秒都在不断产生。管理这些海量时序数据需要专业的数据库系统。时序数据库产品正逐渐受到市场的关注&#xff0c;本文将分享如何通过开源的方式&#xff0…

高并发内存池实战指南

项目源码&#xff1a;https://gitee.com/kkkred/thread-caching-malloc 目录 一、脱离new&#xff1a;高并发内存池如何替代传统动态分配 1.1 new的痛点&#xff1a;碎片、延迟与锁竞争 1.2 高并发内存池的替代方案&#xff1a;分层预分配无锁管理 二、大内存&#xff08;…

基于springboot+vue的数字科技风险报告管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 管理员登录 管理…

实战篇----利用 LangChain 和 BERT 用于命名实体识别-----完整代码

上一篇文章讲解了Langchain,实现一个简单的demo,结合利用 LangChain 和 BERT 用于命名实体识别。 一、命名实体识别模型训练(bert+CRF) bert作为我们的预训练模型(用于将输入文本转换为特征向量),CRF作为我们的条件随机场(将嵌入特征转为标签),既然要训练,那么我们的损失函…

现代 C++ 容器深度解析及实践

一、线性容器&#xff1a;std::array 与 std::forward_list 1. std::array&#xff1a;固定大小的高效容器 在传统 C 中&#xff0c;数组与 vector 的抉择常让人纠结&#xff1a;数组缺乏安全检查&#xff0c;vector 存在动态扩容开销。C11 引入的std::array完美平衡了两者优…

数据集|猪姿态检测PigBehaviorRecognitionDataset

数据集|猪姿态检测PigBehaviorRecognitionDataset 一、数据集介绍1.1 介绍1.2 用途1.3 数据集统计 二、样本类别介绍1. Lying&#xff08;躺卧&#xff09;2. Sleeping&#xff08;睡眠&#xff09;3. Investigating&#xff08;探索&#xff09;4. Eating&#xff08;进食&…

Vue-13-前端框架Vue之应用基础路由器的使用步骤

文章目录 1 路由和路由器2 基本切换效果2.1 App.vue(根组件)2.2 components(子组件)2.2.1 Home.vue(首页)2.2.2 News.vue(新闻)2.2.3 About.vue(关于)2.3 路由器2.3.1 router/index.ts2.3.2 main.ts2.4 效果展示2.5 程序流程3 笔记3.1 路由组件和一般组件3.1.1 Header.vue(一般…

GaussDB实例级自动备份策略:构建数据安全的“自动防护网”

GaussDB实例级自动备份策略&#xff1a;构建数据安全的“自动防护网” 在数字化转型的浪潮中&#xff0c;数据库作为企业核心数据的载体&#xff0c;其安全性与可恢复性直接关系到业务的连续性。对于分布式数据库GaussDB而言&#xff0c;实例级自动备份策略是保障数据安全的关…

推荐几本关于网络安全的书

对于网络安全从业者、相关专业学生以及对网络安全感兴趣的人士而言&#xff0c;掌握扎实的网络安全知识和技能至关重要。以下推荐的几本网络安全书籍&#xff0c;涵盖了网络安全领域的多个重要方面&#xff0c;是学习和研究网络安全的优质参考资料。 1、攻击网络协议&#xff…

工业4.0浪潮下PROFIBUS DP转ETHERNET/IP在轧钢厂的创新实践

在工业自动化4.0推动制造业向智能化升级的背景下&#xff0c;轧钢厂生产对设备互联与数据协同提出更高要求。PROFIBUS DP与ETHERNET/IP协议的特性差异&#xff0c;制约着西门子PLC与工业测距仪等设备的高效协作。通过协议转换技术实现两者互通&#xff0c;为轧钢生产线注入智能…

从0开始学习R语言--Day31--概率图模型

在探究变量之间的相关性时&#xff0c;由于并不是每次分析数据时所用的样本集都能囊括所有的情况&#xff0c;所以单纯从样本集去下判断会有武断的嫌疑&#xff1b;同样的&#xff0c;我们有时候也想要在数据样本不够全面时就能对结果有个大概的了解。 例如医生在给患者做诊断…

微信小程序进度条progress支持渐变色

微信小程序自带进度条progress支持渐变色代码 .wx-progress-inner-bar {border-radius: 8rpx !important;background: linear-gradient(90deg, #FFD26E 8%, #ED0700 100%) !important; }<view class"progress-box"><progress percent"80" back…

Linux内核网络协议栈深度解析:面向连接的INET套接字实现

深入剖析Linux内核中TCP连接管理的核心机制,揭示高效网络通信的实现奥秘。 一、源地址匹配:连接建立的第一道关卡 在TCP连接建立过程中,内核需要验证源地址是否匹配。inet_rcv_saddr_equal()函数是实现这一功能的核心,它巧妙地处理了IPv4/IPv6双栈环境: bool inet_rcv_s…