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.mzph.cn/news/97832.shtml

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

相关文章

【Linux】Vim使用总结

【Linux】Vim使用总结 Vim 的三种模式命令行模式1. 移动2.复制,粘贴,剪切3.撤销4.大小写切换,替换,删除 插入模式底行模式 Vim 的三种模式 一进入VIM就是处于一般模式(命令模式),该模式下只能输…

ES 关于 remote_cluster 的一记小坑

最近有小伙伴找到我们说 Kibana 上添加不了 Remote Cluster,填完信息点 Save 直接跳回原界面了。具体页面,就和没添加前一样。 我们和小伙伴虽然隔着网线但还是进行了深入、详细的交流,梳理出来了如下信息: 两个集群:…

架构师-软件工程习题选择题

架构师-软件工程习题选择题

不同数据类型在单片机内存中占多少字节?

文章目录 前言一、不同编译器二、C51* 指针型 三、sizeof结构体联合体 前言 在C语言中,数据类型指的是用于声明不同类型的变量或者函数的一个广泛的系统。变量的类型决定了变量存储占用的空间 一、不同编译器 类型16位编译器大小32位编译器大小64位编译器大小char…

HTTPS工作过程,国家为什么让http为什么要换成https,Tomcat在MAC M1电脑如何安装,Tomcat的详细介绍

目录 引言 一、HTTPS工作过程 二、Tomcat 在访达中找到下载好的Tomcat文件夹(这个要求按顺序) zsh: permission denied TOMCAT的各部分含义: 引言 在密码中一般是:明文密钥->密文(加密) &#xff…

机器学习笔记 - 深入研究spaCy库及其使用技巧

一、简述 spaCy 是一个用于 Python 中高级自然语言处理的开源库。它专为生产用途而设计,这意味着它不仅功能强大,而且快速高效。spaCy 在学术界和工业界广泛用于各种 NLP 任务,例如标记化、词性标注、命名实体识别等。 安装,这里使用阿里的源。 pip install spacy…

三十二、【进阶】hash索引结构

1、hash索引结构 (1)简述: hash索引,就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。 (2)图示: 2、hash索引结构…

elasticsearch深度分页问题

一、深度分页方式from size es 默认采用的分页方式是 from size 的形式,在深度分页的情况下,这种使用方式效率是非常低的,比如我们执行如下查询 1 GET /student/student/_search 2 { 3 "query":{ 4 "match_all":…

【算法练习Day15】平衡二叉树二叉树的所有路径左叶子之和

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 平衡二叉树二叉树的所有路径…

周总结【java项目】

项目进度: 学习了JavaFX,下载了sceneBuilder辅助工具构建窗口(目前建立了登陆,注册,忘记密码的界面),然后是学习了MySQL的连接,现在的项目是刚连上数据库; 下一步&…

多线程锁-synchronized字节码分析

从字节码角度分析synchronized实现 javap -c(v附加信息) ***.class 文件反编译 synchronized同步代码块 >>>实现使用的是monitorenter和monitorexit指令 synchronized普通同步方法 >>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置&#xf…

【项目】5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步(网络IO) 典型的一次IO的两个阶段是什么?数据就绪和数据读写 数据就绪:根据IO操作的就绪状态 阻塞非阻塞 数据读写:根据应用程序和内核的交互方式 同步异步 陈硕:在处理IO的…

华为云API自然语言处理的魅力—AI情感分析、文本分析

云服务、API、SDK,调试,查看,我都行 阅读短文您可以学习到:人工智能AI自言语言的情感分析、文本分词、文本翻译 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&a…

Mac os 点击桌面 出现黑边框 解决

1、桌面黑框效果 2、解决:设置为 仅在台前调度中

水波纹文字效果动画

效果展示 CSS 知识点 text-shadow 属性绘制立体文字clip-path 属性来绘制水波纹 工具网站 CSS clip-path maker 效果编辑器 页面整体结构实现 使用多个 H2 标签来实现水波纹的效果实现&#xff0c;然后使用clip-path结合动画属性一起来进行波浪的起伏动画实现。 <div …

CSS基础语法之盒子模型

目录 一、 选择器 1.1 结构伪类选择器 1.1.1基本使用 1.1.2 :nth-child(公式) 1.2 伪元素选择器 二、 PxCook 三、盒子模型 3.1 盒子模型-组成 3.2 边框线 3.2.1四个方向 3.2.2 单方向边框线 3.3 内边距 3.4 尺寸计算 3.5 外边距+版心居中 3.6 清除默认样式 3.7…

11.3 读图举例

一、低频功率放大电路 图11.3.1所示为实用低频功率放大电路&#xff0c;最大输出功率为 7 W 7\,\textrm W 7W。其中 A \textrm A A 的型号为 LF356N&#xff0c; T 1 T_1 T1​ 和 T 3 T_3 T3​ 的型号为 2SC1815&#xff0c; T 4 T_4 T4​ 的型号为 2SD525&#xff0c; T 2…

【从0开始配置前后端项目】——Docker环境配置

1. 准备一台纯净的服务器 镜像&#xff1a;CentOS 7.9 64位 CPU & 内存&#xff1a;2核2G 系统盘&#xff1a;60GB 峰值带宽&#xff1a;30Mbps 流量包&#xff1a;600GB / 600GB 2. 安装Docker 2.1 卸载旧的版本 $ sudo yum remove docker \docker-client \docker-cl…

【ONE·Linux || 多线程(二)】

总言 多线程&#xff1a;生产者消费者模型与两种实现方式&#xff08;条件变量、信号量&#xff09;、线程池。 文章目录 总言4、生产者消费者模型4.1、基本概念4.2、基于BlockingQueue的生产者消费者模型&#xff08;理解条件变量&#xff09;4.2.1、单生产者单消费者模式&am…

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…