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

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

相关文章

【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解

一,域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集,比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具,汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

攻防世界-T1 Training-WWW-Robots

文章目录 步骤1步骤二结束语 步骤1 看到文本——>提取有效信息——>利用有效信息 文本:In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they …

elementui修改message消息提示颜色

/* el弹出框样式 */ .el-message {top: 80px !important;border: 0; }.el-message * {color: var(--white) !important;font-weight: 600; }.el-message--success {background: var(--themeBackground); }.el-message--warning {background: var(--gradientBG); }.el-message--…

Linux自用笔记

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Linux相关 ✨特色专栏: My…

SRTP交叉编译与移植

1 SRTP源码下载 源码下载在github采用的库为libsrtp2.5.0: weget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz2 SRTP交叉编译 新增交叉编译脚本,这里需要支持openssl。 ./configure --hostarm-linux-androideabi --prefix$(pwd)/object …

【JavaEE】_构造HTTP请求与HTTPS

目录 1. 构造HTTP请求 1.1 form标签构造HTTP请求 1.1.1 form标签构造GET请求 1.1.2 form标签构造POST请求 1.2 通过ajax构造HTTP请求 1.3 form与ajax 1.4 使用ajax构造HTTP请求 2.HTTPS 2.1 对称加密 2.2 非对称加密 2.3 证书 1. 构造HTTP请求 1.1 form标签构造HTT…

【Luckfox pico入门记录(一)】开发环境与工具链

写在前面 最近刷bilibili发现微雪电子关于luckyfox pico的介绍视频,感叹linux开发板居然可以把价格缩到100RMB以内,也正巧结束了复旦微比赛,受够了FM33LC046N的低性能,来玩点便宜又高性能的板子。   开发板型号:luck…

起号1个月后,我分析了一些AI数字人项目的红利期和优缺点

本期是赤辰第33期AI项目教程,底部准备了9月粉丝福利,可以免费领取。hi,同学们,AI的应用在各场景都已经呈井喷态势,好比就连近期的杭州亚运会开幕式都采用了数字人火炬手,AI技术的发展不断刷新着我们的脑洞上…

一文搞懂时间序列ARIMA模型

文章目录 1 ARIMA的定义2 差分(differencing)2.1 Order:差分的阶数2.2 Lag:差分的滞后2.3 滞后运算/滞后算子/延迟算子2.4 关于差分的两个误解 3 ARIMA的平稳性4 ACF与PACF5 时序模型的选择与评估5.1 超参数p、q、d的确定5.2 时间序列的评估指标 1 ARIMA…

前几周的阅读的论文(截图版)

目录 显著性检测DMTSCWSSODGCoNet RSI与SOD结合ACCoNetGLGCNet RSI结合分割CADA_MaskFormerSeMask-Mask2Formershunted-MaskFormer 显著性检测 DMT CVPR 2023 SCWSSOD AAAI 2021 GCoNet SCI1区 2023 RSI与SOD结合 ACCoNet SCI1区 2023 GLGCNet SCI1区 2023 …

总结三:计算机网络面经

文章目录 1、简述静态路由和动态路由?2、说说有哪些路由协议,都是如何更新的?3、简述域名解析过程,本机如何干预域名解析?4、简述 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?5、简述网关的…

专业图像处理软件DxO PhotoLab 7 mac中文特点和功能

DxO PhotoLab 7 mac是一款专业的图像处理软件,它为摄影师和摄影爱好者提供了强大而全面的照片处理和编辑功能。 DxO PhotoLab 7 mac软件特点和功能 强大的RAW和JPEG格式处理能力:DxO PhotoLab 7可以处理来自各种相机的RAW格式图像,包括佳能、…

Linuxzhi6通过源代码编译安装软件

目录 一、使用源代码安装软件的优点 二、编译需求 三、安装 一、使用源代码安装软件的优点 由于自由软件的最新版本大都以源码的形式最先发布,编译安装可以获得软件的最新版本,及时修 复bug 如果当前安装的程序无法满足需求,用户可以根据…

国庆作业 day 2

select实现服务器并发 #include<myhead.h> #define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.0.103" //本…

UGUI交互组件Toggle

一.Toggle对象的构造 Toggle和Button类似&#xff0c;是交互组件的一种 如果所示&#xff0c;通过菜单创建了两个Toggle&#xff0c;Toggle2中更换了背景和标记资源 对象说明Toggle含有Toggle组件的对象Background开关背景Checkmark开关选中标记Label名称文本 二.Toggle组件属…

基于SSM的在线电影评价系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

中断:ZYNQ

整个中断系统架构中&#xff0c;只包含以下三种中断&#xff1a;  软件生成中断(Software Generated Interrupts&#xff0c;SGI)  私有外设中断(Private Peripheral Interrupts&#xff0c;PPI)  共享外设中断(Shared Peripheral Interrupts&#xff0c;SPI) 每种中断…

vue-img-cutter 实现图片裁剪[vue 组件库]

借助 vue-img-cutter 可以在网页端实现图片裁剪功能&#xff0c;最终功能效果如下&#xff1a; 组件 npm 安装 npm install vue-img-cutter2 --save-dev # for vue2 npm install vue-img-cutter3 --save-dev # for vue3vue-img-cutter使用 template模板标签模块&#xff0c…

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域

文章目录 前言 1&#xff1a;什么叫作用域 一&#xff1a;全局作用域 1&#xff1a;全局变量的声明 2&#xff1a;变量声明和使用的顺序 3&#xff1a;方法声明和使用的顺序 前言 1&#xff1a;什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…

MFC ExtTextOut函数学习

ExtTextOut - 扩展的文本输出&#xff1b; win32 api的声明如下&#xff1b; ExtTextOut( DC: HDC; {设备环境句柄} X, Y: Integer; {起点坐标} Options: Longint; {选项} Rect: PRect; {指定显示范围; 0 表示限制范围} Str: PChar; {字符串…