当前位置: 首页 > news >正文

记录爬虫编写步骤

本文讲解 Python 爬虫实战案例:抓取百度贴吧(https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。今天一个毕业学生问到一个问题:不清楚编写爬虫的步骤,不知道如何下手,故简单的给该学生简单总结了一下编写步骤,有了编写步骤,在以后编写爬虫按步骤来,兴许会有事半功倍的效果,本文我们将使用面向对象的编程方法来编写程序。注意,本文只简单做步骤编写,不做数据的分析。步骤如下

寻找URL变化规律

接下来寻找要爬取页面的 URL 规律,搜索“Python爬虫”后,此时贴吧第一页的的 url 如下所示:https://tieba.baidu.com/f?ie=utf-8&kw=python爬虫&fr=search点击第二页,其 url 信息如下:https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=50点击第三页,url 信息如下:https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=100重新点击第一页,url 信息如下:https://tieba.baidu.com/f?kw=python爬虫&ie=utf-8&pn=0

如果还不确定,您可以继续多浏览几页。最后您发现 url 具有两个查询参数,分别是 kw 和 pn,并且 pn 参数具有规律性,如下所示:

第n页:pn=(n-1)*50#参数params
pn=(page-1)*50
params={'kw':name,'pn':str(pn)}

url 地址可以简写为:

https://tieba.baidu.com/f?kw=python爬虫&pn=450

编写爬虫程序

以面向对象方法编写爬虫程序时,思路简单、逻辑清楚,非常容易理解,我们可以按照以下步骤进行编写:

1) 请求函数

请求函数最终的结果是返回一个 HTML 对象,以方便后续的函数调用它。

2) 解析函数

解析函数用来解析 HTML 页面,常用的解析模块有正则解析模块、bs4 解析模块。通过分析页面,提取出所需的数据,在后续内容会做详细介绍。

3) 保存数据函数

该函数负责将抓取下来的数据保至数据库中,比如 MySQL、MongoDB 等,或者将其保存为文件格式,比如 csv、txt、excel 等。

4) 入口函数

入口函数充当整个爬虫程序的桥梁,通过调用不同的功能函数,实现数据的最终抓取。入口函数的主要任务是组织数据,比如要搜索的贴吧名、编码 url 参数、拼接 url 地址、定义文件保存路径。

下面以类的形式编写爬虫程序,并在类下编写不同的功能函数,代码如下所示:

from urllib import request
from urllib import parse
from fake_useragent import UserAgent
import time
import random#  定义爬虫类
class TiebaSpider(object):# 初始化url实例属性def __init__(self):self.url = "https://tieba.baidu.com/f?kw={}&pn={}"# 请求函数,得到页面def get_html(self, url):# 使用第三方库设置UAheaders = {'User-Agent': UserAgent().firefox}# 重构请求对象req = request.Request(url=url, headers=headers)response = request.urlopen(req)# 返回整个页面return response.read().decode('utf-8')# 解析函数,此处代码暂时省略def parse_html(self, html):pass# 该函数负责将抓取下来的数据保至数据库中,比如 MySQL、MongoDB 等,或者将其保存为文件格式,比如 csv、txt、excel 等def save_html(self, filename, html):with open(filename, 'w', encoding='utf-8') as f:f.write(html)# 入口函数def run(self):kw = input("请输入要爬取的关键字")parse_kw = parse.quote(kw)begin = int(input("请输入开始页"))end = int(input("请输终止始页"))pn = (begin - 1) * 50for i in range(begin, end + 1):# 重构文件名称filename = f'{kw}_{i}.html'# 拼接urlurl = self.url.format(parse_kw, pn)# 调用保存方法self.save_html(filename, self.get_html(url))print(f"第{i}页抓取成功")# 每爬取一个页面随机休眠2-3秒钟的时间time.sleep(random.randint(2, 3))#以脚本的形式启动爬虫
if __name__ == '__main__':start = time.time()spider = TiebaSpider()spider.run()stop = time.time()print('爬取完成,共耗%.2f时间' % (stop - start))

程序执行后,爬取的文件将会保存至 Pycharm 当前工作目录,输出结果:

请输入要爬取的关键字python
请输入开始页1
请输终止始页5
第1页抓取成功
第2页抓取成功
第3页抓取成功
第4页抓取成功
第5页抓取成功
爬取完成,共耗23.88时间

爬虫程序结构总结

用面向对象的方法编写爬虫程序时,逻辑结构较为固定,总结如下:

# 程序结构
class xxxSpider(object):def __init__(self):# 定义常用变量,比如url或计数变量等def get_html(self):# 获取响应内容函数,使用随机User-Agentdef parse_html(self):# 使用正则表达式来解析页面,提取数据def write_html(self):# 将提取的数据按要求保存,csv、MySQL数据库等def run(self):# 主函数,用来控制整体逻辑if __name__ == '__main__':# 程序开始运行时间spider = xxxSpider()spider.run()

注意:掌握以上编程逻辑有助于您后续的学习。

相关文章:

记录爬虫编写步骤

本文讲解 Python 爬虫实战案例:抓取百度贴吧(https://tieba.baidu.com/)页面,比如 Python爬虫吧、编程吧,只抓取贴吧的前 5 个页面即可。今天一个毕业学生问到一个问题:不清楚编写爬虫的步骤,不…...

SpringBoot配置Swagger2与Swagger3

swagger是什么? 在平时开发中,一个好的API文档可以减少大量的沟通成本,还可以帮助新加入项目的同事快速上手业务。大家都知道平时开发时,接口变化总是很多,有了变化就要去维护,也是一件比较头大的事情。尤…...

C/C++ 枚举

目录 枚举概述 枚举的使用 枚举的大小计算 枚举的优点 C语言中的自定义类型有:结构 位段 枚举 联合 枚举概述 枚举顾名思义就是一一列举,把可能的取值一一列举。 比如我们现实生活中:一周的星期一到星期日是有限的7天&#xff0c…...

P12 音视频复合流——TS流讲解

前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…...

三维重建 3D Gaussian Splatting:实时的神经场渲染

目录 概念理解三维高斯喷洒 渲染实例 依赖项: 编译报错: 预训练模型 13G:...

Django Web框架

1、创建PyCharm项目 2、安装框架 pip install django4.2.0 3、查看安装的包列表 4、使用命令创建django项目 django-admin startproject web 5、目录结构 6、运行 cd web python manage.py runserver7、初始化后台登录的用户名密码 执行数据库迁移生成数据表 python man…...

ARCGIS PRO SDK GeometryEngine.Intersection的GeometryDimensionType 枚举

描述几何对象的维度。与 GeometryEngine.Intersection 一起使用。 ​ 成员描述EsriGeometry0Dimension零维(点或多点)。EsriGeometry1Dimension一维(折线)。EsriGeometry2Dimension二维(多边形或包络)。Es…...

Web网页开发-CSS层叠样式表1-笔记

1.CSS的引入方式 (1)内嵌式:把style双标签写在head标签里面,可以影响同种标签 (2)行内式:把style写在标签内部,只能影响当前标签 (3)外链式:创建css文件,使用link将html文件和css文件连接起来 (4)导入式&am…...

如何预防变种.halo勒索病毒感染您的计算机?

尊敬的读者: 在数字时代,威胁网络安全的.halo勒索病毒日益猖狂。本文将深入介绍.halo病毒的攻击方式,以及针对被加密文件的恢复方法和预防措施。在面对被勒索病毒攻击导致的数据文件加密问题时,技术支持显得尤为重要,…...

短网址的新玩法,短到只剩域名

短网址大家应该都不陌生了,一句话就可以解释清楚,把一串很长的网址缩短到只有几个字符依然可以正常访问,缩短之后会更加简洁美观。 那大家见过的短网址一般长啥样呢,比如t.cn/xxxxx、dwz.cn/xxxxx、c1ns.cn/xxxxx。这些短网址都有…...

FA2016AA (MHz范围晶体单元超小型低轮廓贴片) 汽车

随着科技的不断发展,智能汽车逐渐成为人们出行的首选。而其中,频率范围在19.2 MHz ~ 54 MHz的晶体单元超小型低轮廓贴片(FA2016AA)为汽车打造更智能、更舒适、更安全的出行体验。FA2016AA贴片的外形尺寸为2.0 1.6 0.5 mm&#x…...

【设计模式之美】面向对象分析方法论与实现(一):需求分析方法论

文章目录 一. 需求举例二. 对案例进行需求分析1. 第一轮基础分析2. 第二轮分析优化3. 第三轮分析优化4. 第四轮分析优化5. 最终确定需求 三. 小结 本文主要描述: 面向对象的需求分析方法论 一. 需求举例 假设,你正在参与开发一个微服务。微服务通过 HTT…...

MySQL视图索引执行计划相关十五道面试题分享

目录 一. 视图 1.1 含义 1.2 操作 创建视图 修改视图 删除视图 查看视图 二. 索引 2.1 什么是索引 2.2 为什么要使用索引 2.3 优点 2.4 缺点 2.5 何时不适用索引 2.6 索引何时失效 三. 执行计划 3.1 什么是执行计划 3.2 执行计划的作用 四. 面试题 表结构 …...

vue绑定背景颜色或背景图片 和 nuxtjs动态设置background-image:

v-bind绑定样式表&#xff1a; ---------------------------------------------------------------------------------------------------- HTML写法: <div class"myItem" style"text-align:center; background-image:url(); background-size:auto 100% ;ba…...

案例099:基于微信小程序的外卖小程序的研究与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

数据库的设计

理解数据库第二范式2NF的必备知识 关系数据库基础&#xff1a; 了解关系数据库的基本概念&#xff0c;包括表格、行、列、主键、外键等。 第一范式&#xff08;1NF&#xff09;&#xff1a; 在理解第二范式之前&#xff0c;首先要了解第一范式。第一范式要求表格中的每个列都包…...

数据比较时String未转成BigDecimal的坑

如果价格的字段是String&#xff0c;要转换成BigDecimal等数字再比较&#xff0c;用String比较会出现奇怪的错误。 这句话看起来很多余&#xff0c;但是实际写代码的时候确是很容易忽略。 比如价格这个字段封装在对象里&#xff0c;而你只是a.getPrice().compareTo(b.getPrice…...

MySQL第三战:CRUD,函数1以及unionunion all

目录 前言 一.CRUD 1.查询 概念&#xff1a; 语法 含义 2.新增 概念&#xff1a; 语法 含义&#xff1a; 3.修改 语法 含义 4.删除 语法 含义 二.函数 1.字符函数 2.数字函数 3.日期函数 4.聚合函数 三.union&union all 概念 语法 专业词解释 使用…...

业务项目中Echarts图表组件的封装实践方案

背景&#xff1a;如果我们的项目是一个可视化类/营销看板类/大屏展示类业务项目&#xff0c;不可避免的会使用到各种图表展示。那在一个项目中如何封装一个图表组件既能够快速复用、UI统一&#xff0c;又可以灵活扩充Echarts的各种复杂配置项配置就变得极为重要。 封装目标 符…...

鸿蒙开发之拖拽事件

一、拖拽涉及的方法 Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//拖拽开始.onDragStart((event: DragEvent) > {console.log(drag event onDragStartevent.getX())})//拖拽进入组件范围&#xff0c;需要监听onDrop配合.onDragEnter((event: DragEvent) …...

C#使用纯OpenCvSharp部署yolov8-pose姿态识别

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…...

[AutoSar]基础部分 RTE 04 数据类型的定义及使用

目录 关键词平台说明一、数据类型分类二、Adt三、Idt四、Base 数据类型五、units六、compu methods七、data constraint 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、数据…...

c#调试程序一次启动两个工程(多个工程)

概述 c# - Visual Studio : debug multiple projects at the same time? 以在解决方案中设置多个启动项目(右键单击解决方案&#xff0c;转到设置启动项目&#xff0c;选择多个启动项目)&#xff0c;并为包含在解决方案(无、开始、不调试就开始)。如果您将多个项目设置为开始…...

轻松搭建企业知识库:10款必备工具推荐

随着企业知识的不断积累和团队规模的扩大&#xff0c;如何高效地管理和利用这些知识成为了一个重要的问题。企业知识库作为一种有效的知识管理工具&#xff0c;可以帮助企业将分散的知识整合在一起&#xff0c;方便团队成员快速查找、学习和共享。接下来就分享10款很不错的企业…...

第三天学习记录

第二天 C++随便提一提重点学习编译原理选学离散数学形式语言与自动机理论数据结构C++ 随便提一提 C++面向对象编程。与强调算法的过程性编程(试图使问题满足语言的过程性方法)不同。面向对象编程强调的是数据,它试图让语言来满足问题的要求。其理念是设计与问题本质特征相对…...

内核线程创建-kthread_create

文章参考Linux内核线程kernel thread详解 - 知乎 大概意思就是早期创建内核线程&#xff0c;是交由内核处理&#xff0c;由内核自己完成&#xff08;感觉好像也不太对呢&#xff09;&#xff0c;创建一个内核线程比较麻烦&#xff0c;会导致内核阻塞。因此就诞生了工作队列以及…...

uniappVue3版本中组件生命周期和页面生命周期的详细介绍

一、什么是生命周期&#xff1f; 生命周期有多重叫法&#xff0c;有叫生命周期函数的&#xff0c;也有叫生命周期钩子的&#xff0c;还有钩子函数的&#xff0c;其实都是代表&#xff0c;在 Vue 实例创建、更新和销毁的不同阶段触发的一组钩子函数&#xff0c;这些生命周期函数…...

任务驱动式编程

main /** 模板代码*/#include "gd32f4xx.h" #include "systick.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "main.h" #include "USART0.h" #include &quo…...

python数据可视化之折线图案例讲解

学习完python基础知识点&#xff0c;终于来到了新的模块——数据可视化。 我理解的数据可视化是对大量的数据进行分析以更直观的形式展现出来。 今天我们用python数据可视化来实现一个2023年三大购物平台销售额比重的折线图。 准备工作&#xff1a;我们需要下载用于生成图表的第…...

QT工具栏开始,退出

QT工具栏开始&#xff0c;退出 //初始化场景QMenuBar *bar menuBar();setMenuBar(bar);QMenu *startbar bar->addMenu("开始");QAction * quitAction startbar->addAction("退出");connect(quitAction , &QAction::triggered,[](){this->c…...

gpl2 wordpress/如何制作一个自己的网页网站

使用vim分屏的时候 &#xff0c;可以在终端直接输入 vim -On 1.php 2.php 3.php 垂直分屏 三个文件 如果是在某个窗口里面想打开另外一个文件如何做呢&#xff1f; 按下esc&#xff0c;然后按下冒号 输入 回车得到 当然我这里弄的是水平窗口了&#xff0c;想得到垂直窗口可以这…...

江苏省建设部网站/百度人工申诉客服电话

在基于服务的分布式事务上篇中&#xff0c; 我们举了了一个业务场景&#xff0c;就是一个初始服务创建了一个分布式事务&#xff0c;在这个分布式事务包含了两个参与服务的本地事务&#xff0c;这两个本地事务由初始服务通过调用两个参与事务的服务方式组合在一起。根据分布式事…...

网站侧栏软件排行榜怎么做的/网站推广方案策划书2000

遇到异常后要保存设备参数和具体异常信息到SDCard2. 在 Application 中的 onCreate() 方法内实例化在 Application onCreate()方法中调用CrashCatchHandler.getInstance().init(getApplicationContext());1. 新建CrashCatchHandler处理类件在 >Android>data>包名>c…...

做网站推广需要什么专业/永久免费制作网页

ASM镜像和磁盘组冗余2017-10-31 Oracle 宅必备上节讲了磁盘发现的内容&#xff0c;这节内容详细讲解写ASM镜像和故障组1. ASM MirroringASM可以为ASM 文件提供镜像服务&#xff0c;做法为将不同的文件区拷贝放在故障组中&#xff0c;这样可以保证文件副本不会存放在同个故障组中…...

wordpress登录框透明/全国培训机构排名前十

序言新接触的项目中存在的大量的原生JDBC的代码&#xff0c;满屏幕都是PrepareStatement 和ResultSet&#xff0c;以及各种关闭资源的语句。所以有了用开源框架去重写的想法&#xff0c;然后就找到了JOOQ。JOOQ是什么&#xff1f;JOOQ是一款ORM框架。JOOQ的作用以及对比其他ORM…...

工信部网站备案/口碑营销的好处

点击上方“iOS开发”&#xff0c;选择“置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;前言在开篇之前思考几个问题&#xff1f;1、继承最大的缺点是什么&#xff1f;2、为什么说耦合也可能是一种需求&#xff1f;3、有哪些场景不适合使用继承&#xff1f;4、继承本…...