Python爬虫——爬虫基础模块和类库(附实践项目)

一、简单介绍

        Python爬虫是使用Python编程语言开发的一种自动化程序,用于从互联网上获取信息。通过模拟浏览器的行为,爬虫可以访问网页、解析网页内容,并提取所需的数据。 

python的爬虫大致可以分为通用爬虫和专用爬虫:

        通用爬虫是一种能够自动化地从互联网上抓取信息的程序,它可以根据用户的需求,爬取各种类型的网页内容,并将其保存或进行进一步处理。通用爬虫通常具有以下特点:

  1. 灵活性:通用爬虫可以爬取各种类型的网页,包括新闻、论坛、博客等,因此具有较高的灵活性。

  2. 自动化:通用爬虫可以通过编程实现自动化的抓取过程,无需人工干预。

  3. 大规模爬取:通用爬虫可以处理大量的网页,并将其保存到本地或进行进一步的分析和处理。

        专用爬虫是一种针对特定网站或特定类型的网页进行定制化开发的爬虫程序,它具有以下特点:

  1. 高度定制化:专用爬虫针对特定网站或特定类型的网页进行开发,可以根据网站的结构和特点进行优化,提高爬取效率和准确性。

  2. 速度较快:由于专用爬虫只需要处理特定类型的网页,因此可以针对性地进行优化,提高爬取速度。

  3. 数据质量较高:专用爬虫可以根据特定网站的要求进行数据抓取和处理,因此可以保证数据的准确性和完整性。

1.1 运行原理 

爬虫通过模拟服务器发送请求并获取对应的信息:

爬虫运行原理(取自bing图库)

步骤介绍:

  1. 发送请求:爬虫首先向目标网站发送HTTP请求,请求获取页面内容。可以使用Python的第三方库如requests发送HTTP请求。

  2. 获取页面内容:目标网站接收到爬虫的请求后,返回相应的页面内容。爬虫通过解析HTTP响应,获取页面内容。可以使用Python的第三方库如BeautifulSoup或者正则表达式进行页面内容的解析和提取。

  3. 解析页面内容:爬虫根据需要的数据类型,对页面内容进行进一步的解析和提取。可以使用XPath、CSS Selector或者正则表达式等方式进行页面内容的解析。

  4. 存储数据:爬虫将解析提取到的数据存储到本地文件或者数据库中。可以使用Python的第三方库如pandas、csv、MySQLdb等进行数据的存储。

  5. 遍历链接:如果需要爬取多个页面,爬虫会根据页面中的链接,递归地发送请求和解析页面,实现对多个页面的遍历。

  6. 反爬虫机制:为了防止被网站屏蔽或者限制,爬虫需要处理一些反爬虫机制,如设置请求头、使用代理IP、降低请求频率等。

 二、python爬虫库

按照爬虫爬取网络信息到最终展示数据分析结果的过程,我总结了以下常用的python第三方库 

2.1 获取网页信息(requests库)

        requests是一个Python的第三方库,用于发送HTTP请求。它是基于urllib3库开发的,比urllib更加方便和简洁。

使用requests库进行爬虫可以实现以下功能:

  1. 发送GET和POST请求
  2. 设置请求头和Cookies
  3. 设置请求参数和URL编码
  4. 处理响应结果,包括获取状态码、响应头和响应内容等
  5. 保存下载的文件
  6. 处理重定向和代理
  7. 使用会话保持会话状态

常用函数:

1.发送请求

requests.get(url, params=None, **kwargs)发送GET请求,参数url为请求的URL,params为请求中的查询参数
requests.post(url, data=None, json=None, **kwargs)发送POST请求,参数url为请求的URL,data为请求中的表单数据,json为请求中的JSON数据。
requests.put(url, data=None, **kwargs)发送PUT请求,参数url为请求的URL,data为请求中的数据。
requests.patch(url, data=None, **kwargs)发送PATCH请求,参数url为请求的URL,data为请求中的数据。
requests.delete(url, **kwargs)发送DELETE请求,参数url为请求的URL。
requests.head(url, **kwargs)发送HEAD请求,参数url为请求的URL。
requests.options(url, **kwargs)发送OPTIONS请求,参数url为请求的URL。
requests.request(method, url, **kwargs)发送任意类型的HTTP请求,参数method为请求的方法,url为请求的URL。
requests.session()创建一个Session对象,用于保持会话状态
requests.get(url, params=None, **kwargs)发送GET请求,参数url为请求的URL,params为请求中的查询参数。

2.获得响应

response = requests.get(url, params=None, **kwargs)发送GET请求并返回响应对象,可以通过该对象获取响应的内容、状态码等信息。
response.text获取响应的文本内容。
response.content获取响应的二进制内容。
response.status_code获取响应的状态码。
response.json()将响应的JSON内容解析为Python对象。
response.headers获取响应的头部信息。
response.cookies获取响应的Cookies信息
response.url获取响应的URL。

拓展

可以发送HTTP请求的库不只于requests库,还有上面提到的urllib等库。综合来看,requests库使用起来最为便捷,但是在一些特定的领域使用其他的库可能会有更好的效果:

  • urllib:一系列用于操作URL的功能。
  • selenium:自动化测试工具。一个调用浏览器的 driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码。
  • aiohttp:基于 asyncio 实现的 HTTP 框架。异步操作借助于 async/await 关键字,使用异步库进行数据抓取,可以大大提高效率。

2.2 解析网页结构,提取数据(BeautifulSoup4)

        BeatifulSoup4是用于解析网页结构的库,它的作用是将获取到的网页HTML和XML文档进行分解。从而定位到我们需要获取的特定信息在网页中的位置。

        当使用BeautifulSoup4库解析HTML或XML文件时,它会根据指定的解析器(如html.parser、lxml等)将文件转换为文档树的形式。文档树由节点(Node)组成,每个节点代表文件中的一个元素(标签、文本等)。这些节点之间通过父子关系、兄弟关系等连接在一起,形成了树状结构。

html树状图(取自bing图库)

以下是BeautifulSoup4常用的方法和模块: 

常用方法和模块

BeautifulSoup这是BeautifulSoup4库的主要类,用于解析HTML和XML文件。可以通过指定解析器(如html.parser、lxml等)来创建一个BeautifulSoup对象,并对解析后的内容进行操作。
find_all()这是BeautifulSoup对象的一个方法,用于查找所有符合指定条件的标签。可以根据标签名、类名、属性等进行查找,并返回一个包含所有匹配标签的列表。
find()

与find_all()类似,但只返回第一个匹配的标签。

select()这是BeautifulSoup对象的另一个方法,用于通过CSS选择器语法来查找标签。可以根据标签名、类名、属性等进行查找,并返回一个包含所有匹配标签的列表
get_text()这是标签对象的方法,用于获取标签内的文本内容。
attrs这是标签对象的属性,用于获取标签的所有属性和属性值。
prettify()这是BeautifulSoup对象的方法,用于美化解析后的内容,使其更易读。

BeautifulSoup4可以结合正则表达式和CSS选择器使用,以便更加精确地解析网页结构

拓展

BeautifulSoup4功能比较全面,简单易用,因此较为常用;但在一些特殊的领域,使用一些其他的库可以达到更好的效果:

  • pyquery:jQuery 的 Python 实现,能够以 jQuery 的语法来操作解析 HTML 文档,易用性和解析速度都很好。
  • lxml:支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
  • tesserocr:一个 OCR 库,在遇到验证码(图形验证码为主)的时候,可直接用 OCR 进行识别。

2.3 数据分析(不包含数据可视化)

Python数据分析这一块内容丰富,常用的库非常多,一篇文章写不完。

以下是一些常用的库:

  1. NumPy:NumPy是一个用于科学计算的基础库,提供了维数组对象和一组用于操作数组的函数。

  2. Pandas:Pandas是用于数据处理和分析的强大库,提供了高性能的数据结构和数据分析工具,如DataFrame和Series。

  3.  SciPy:SciPy是一个用于科学计和技术计算的库,提供了许数学、科学和工程计算功能,如数值积分、化、线性代数等。

  4. Scikit-learn:Scikit-learn是一个用于机器学习和数据挖掘的库,提供了各种机器学习算法和工具,用于分类、回归、聚类等任务。

  5. StatsModels:Models是一个用于统计建模和计量经学的库,提供了各种统计模型和统计分析工具。

  6. TensorFlow:TensorFlow是一个用于机器学习和深度习的库,提供了各种机器学习算法和神经网络模型的实现。

2.4 数据可视化(Matplotlib)

        Matplotlib是一个广泛使用的绘图库,提供了许多函数和方法用于创建各种类型的图表。

        Matplotlib提供了丰富的绘图功能,包括线图、散点图、柱状图、饼图、3D图形等。它还支持自定义图形的颜色、样式、标签和图例等属性。Matplotlib还可以在Jupyter Notebook中以交互方式显示图形。

        Matplotlib的基本用法包括创建图形对象、添加子图、设置图形属性、绘制数据等。它还提供了一系列的函数和方法来控制坐标轴、刻度、网格、标签、标题等。

常用的绘图模块为pyplot模块,使用前应先导入

import matplotlib.pyplot as plt

以下是Matplotlib.pyplot常用的函数:

plt.plot(x, y, …)绘制折线图,可以指定x轴和y轴的数据。
plt.scatter(x, y, …)绘制散点图,可以指定x轴和y轴的数据。
plt.bar(x, y, …)绘制柱状图,可以指定x轴和y轴的数据。
plt.hist(x, …)绘制直方图,可以指定一维数据数组。
plt.pie(x, labels, …)绘制饼图,可以指定饼图的数据和标签。
plt.boxplot(x, …)绘制箱线图,可以指定一维或二维数据数组。
plt.imshow(image, …)显示图像,可以指定图像的像素数据。
plt.contour(x, y, z, …)绘制等高线图,可以指定x轴、y轴和z轴的数据。
plt.plot_surface(x, y, z, …)

绘制三维曲面图,可以指定x轴、y轴和z轴的数据。

plt.xlabel(label)设置x轴标签。
plt.ylabel(label)设置y轴标签。
plt.title(title)设置图表标题。
plt.legend()显示图例。
plt.grid()显示网格线。
plt.xlim(xmin, xmax)设置x轴的显示范围。
plt.ylim(ymin, ymax)设置y轴的显示范围。

除了matplotlib.pyplot模块之外,Matplotlib还包括其他一些模块,用于不同的功能和任务。以下是一些常用的Matplotlib模块:

  1. matplotlib.figure:该模块提供了Figure类,用于创建和管理图形对象。Figure类是图形的顶级容器,可以包含多个子图。

  2. matplotlib.axes:该模块提供了Axes类,用于绘制图表的坐标轴和图形元素。Axes类是图表的子图,用于在图形对象中放置图表元素。

  3. matplotlib.axis:该模块提供了Axis类,用于管理坐标轴的属性和刻度。Axis类负责绘制坐标轴和刻度线,并提供了一些方法用于设置刻度标签和刻度范围。

  4. matplotlib.patches:该模块提供了各种形状的Patch类,用于绘制图形元素,如矩形、圆形、多边形等。这些图形元素可以添加到Axes对象中。

  5. matplotlib.lines:该模块提供了Line2D类,用于绘制线条和曲线。Line2D类可以用于绘制折线图、曲线图等。

  6. matplotlib.text:该模块提供了Text类,用于在图表中添加文本标注。Text类可以用于添加标题、标签、注释等文本内容。

了上述模块之外,还有其他一些模块用于特定的任务,如matplotlib.colors(颜色处理)、matplotlib.colorbar(颜色条处理)、matplotlib.ticker(刻度处理)等。

三、项目实践

介绍

从豆瓣上挖取2022年250个经典电影的名单并绘制成词云图

代码

import requests
from bs4 import BeautifulSoup
from wordcloud import WordCloud
import matplotlib.pyplot as plt# 用于绘制词云图的列表
title_list = []#设置请求头,避免网页出现418问题
head = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.47','referer': 'https://movie.douban.com/subject/33447633/?from=showing'
}# 逐页爬取
for start_num in range(0, 250, 25):context = requests.get(f'https://movie.douban.com/top250?start={start_num}', headers=head).textsoup = BeautifulSoup(context, 'html.parser')# 获取标签span中class为title的对象all_titles = soup.findAll("span", attrs={'class': 'title'})# 将内容输入绘制词云图使用的列表for title in all_titles:title_string = title.stringif "/" not in title_string:# print(title_string)title_list.append(title_string)# print(title_list)
text = ' '.join(title_list)wc = WordCloud('C:\Windows\Fonts\Microsoft YaHei UI\msyh.ttc', background_color='white', width=600,height=400, max_words=50).generate(text)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()

注:上面的print语句为调试节点,用于中途检查获取的内容和列表。

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 基本语句_5_创建静态库|动态库

静态库 创建主函数:main.c 应用函数:add.c、sub.c、mul.c 创建calc.h文件作为头文件 生成可执行文件*.o文件 gcc -c add.c -o add.o ....包装*.o文件为静态库 ar -rc libmymath.a add.o sub.o mul.o编译静态库并指明创建静态库的位置 sudo gcc mai…

Python操作MongoDb创建文档及CRUD基本操作

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 MongoDB 操作手册----文档…

git提交代码实际操作

1.仓库的代码 2.克隆代码下存在的分支 git clobe https://gitee.com/sadsadasad/big-event-11.git 3.查看当下存在的分支 git branch -a 在很多情况下,我们是要围绕着dev分支进行开发,所以我们可以在开发之前问明白围绕那个分支进行开发。 4.直接拉去dev分支代码 5.如果没在…

程序三高的方法

程序三高的方法 目录概述需求: 设计思路实现思路分析1.1)高并发 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,c…

安卓教材学习

文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要:选了几本教材《第一行代码 Android 第3版》,记录一下跑案例遇到的问题,和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…

人机关系不是物理关系也不是数理关系

人机关系是一种复杂的社会技术系统,涉及到人类和机器、环境之间的相互作用和影响。它不仅限于物理接触和数理规律,同时还包括了思维、情感、意愿等方面的交流和互动。在人机关系中,人类作为使用者和机器作为工具(将来可能会上升到…

【网站】让自己的个人主页能被Google检索

参考: https://zhuanlan.zhihu.com/p/129022264

JUC第十五讲:JUC集合-ConcurrentHashMap详解(面试的重点)

JUC第十五讲:JUC集合-ConcurrentHashMap详解 本文是JUC第十五讲:JUC集合-ConcurrentHashMap详解。JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组链表红黑树数据结构和CAS原子操作实现ConcurrentHashMap;本文…

1.3.OpenCV技能树--第一单元--图像的基础操作(基础篇)

文章目录 1.文章内容来源2.图像的基本操作2.1.图像加载2.2.图像显示2.3.数据读取2.4.截取图像2.5.颜色通道提取2.5.1.保留红色处理2.5.2.保留绿色处理2.5.3.保留蓝色处理 3.易错点总结与反思 1.文章内容来源 1.题目来源: 2.资料来源:https://edu.csdn.net/skill/opencv/opencv…

C++笔记之信号量、互斥量与PV操作

C笔记之信号量、互斥量与PV操作 文章目录 C笔记之信号量、互斥量与PV操作1.信号量概念2.信号量例程一3.信号量例程二4.信号量例程三5.互斥量6.PV操作概念7.PV操作详解——抄自:https://mp.weixin.qq.com/s/vvjhbzsWQNRkU7-b_dURlQ8.PV操作的英文全称 1.信号量概念 …

Vscode爆红Delete `␍`eslintprettier/prettier

一、先看报错 文件中爆红,提示 Delete ␍eslintprettier/prettier 二、解决方案 项目根目录下,.prettierrc.js 文件中: endOfLine: auto,三、重启VsCode 此时不在爆红,问题完美解决

云原生Kubernetes:简化K8S应用部署工具Helm

目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…

Redis-双写一致性

双写一致性 双写一致性解决方案延迟双删(有脏数据的风险)分布式锁(强一致性,性能比较低)异步通知(保证数据的最终一致性,高并发情况下会出现短暂的不一致情况) 双写一致性 当修改了数…

【word】从正文开始设置页码

在写报告的时候,会要求有封面和目录,各占一页。正文从第3页开始,页码从正文开始设置 word是新建的 分出三节(封面、目录、正文) 布局--->分割符--->分节符--->下一页 这样就能将word分为3节,分…

深度学习-卷积神经网络-AlexNET

文章目录 前言1.不同卷积神经网络模型的精度2.不同神经网络概述3.卷积神经网络-单通道4.卷积神经网络-多通道5.池化层6.全连接层7.网络架构8.Relu激活函数9.双GPU10.单GPU模型 1.LeNet-52.AlexNet1.架构2.局部响应归一化(VGG中取消了)3.重叠/不重叠池化4…

Python 列表推导式深入解析

Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式,用于创建列表。它基于一个现有的迭代器(如列表、元组、集合等)来生成新的列表。 基本语法: 列表推导式的基本形式如下: [expression for…

Android 开发错误集合

🔥 开发错误集合一 🔥 Caused by: java.lang.ClassNotFoundException: Didnt find class "com.mask.app.ui.LoginRegisterActivity" on path: DexPathList[[zip file "/data/app/~~NMvHVhj8V6-HwGbh2amXDA/com.mask.app-PWbg4xIlETQ3eVY…

基于蝴蝶优化的BP神经网络(分类应用) - 附代码

基于蝴蝶优化的BP神经网络(分类应用) - 附代码 文章目录 基于蝴蝶优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蝴蝶优化BP神经网络3.1 BP神经网络参数设置3.2 蝴蝶算法应用 4.测试结果:5.M…

C++设计模式-原型(Prototype)

目录 C设计模式-原型(Prototype) 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-原型(Prototype) 一、意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 二、适用性 当…

[图论]哈尔滨工业大学(哈工大 HIT)学习笔记23-31

视频来源:4.1.1 背景_哔哩哔哩_bilibili 目录 1. 哈密顿图 1.1. 背景 1.2. 哈氏图 2. 邻接矩阵/邻接表 3. 关联矩阵 3.1. 定义 4. 带权图 1. 哈密顿图 1.1. 背景 (1)以地球为建模,从一个大城市开始遍历其他大城市并且返回…