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

网络爬虫的介绍

网络爬虫库

网络爬虫通俗来讲就是使用代码将HTML网页的内容下载到本地的过程。爬取网页主要是为了获取网中的关键信息,例如网页中的数据、图片、视频等。Python语言中提供了多个具有爬虫功能的库,下面将具的介绍。

urlib库:是Python自带的标准库,无须下载、安装即可直接使用。urllib库中包含大量的爬虫功能,但其代码编写略微复杂。

requests库:是python的第三方库,需要下载、安装之后才能使用。由于requests库是在urllib库的基础上建立的,它包含urlib库的功能,这使得requests库中的函数和方法的使用更加友好,因此requests库使用起来更加简洁、方便。

scrapy库:是Python的第三方库,需要下载、安装之后才能使用。scrapy库是一个适用于专业应用程序开发的网络爬虫库。scrapy库集合了爬虫的框架,通过框架可创建一个专业爬虫系统。

selenium库:是Python的第三方库,需要下载、安装后才能使用。selenium库可用于驱动计算机中的浏览器执行相关命令,而无须用户手动操作。常用于自动驱动浏览器实现办公自动化和Web应用程序测试。

基于办公自动化的使用场景,本章主要介绍requests库和selenium库。而scrapy库是专业级爬虫库,如果读者对网络爬虫感兴趣,可以进入Python爬虫领域进行更深层次的学习。

robots.txt规则

在正式学习网络爬虫之前,读者需要掌握爬取规则,不是网站中的所有信息都允许被爬取,也不是所有的网站都允许被爬取。在大部分网站的根目录中存在一个robots.txt文件,该文件用于声明此网站中禁止访问的url和可以访问的url。用户只需在网站域名后面加上/robots.txt即可读取此文件的内容。

例如要获取豆瓣官网中的robots.txt文件,打开浏览器输入豆瓣官网域名并在域名后加上/robots.txt,按Enter键即可,如图15-1所示。豆瓣官网的主域名下存在大量的子域名,例如某个电影的影评url是在主域名的基础上增加子目录,其形式与磁盘中的目录路径相同。

robots.txt规则用于表明当前网站中的哪些内容是可以访问的哪些内容是禁止访问的。接下来具体介绍robots.txt文件的内容。
User-agent:表示访问网站的搜索引擎,第1个User-agent的值为*,表示所有类型的搜索引擎都需要遵守第2~21行的规则。第2个User-agent的值头W彥andouiia Spider,表示Wandoujia Spider搜索引擎需要遵守的规则。

requests 库和网页源代码

主要讲解requests库的安装及如何获取网页源代码。

requests 库的安装

在命令提示符窗口或终端中执行以下命令:

pip install requests

安装成功后可使用以下命令查看库的信息:

pip show requests

返回信息包含当前安装的requests库的版本信息、官方地址、安装目录等。

网页源代码

用户在使用浏览器访同网页时,往往会忽视网页的源代码,而获取网页中的信息需要从网页的源代码出发。

例如使用浏览器(本书使用的是chrome浏览器)打开人民邮电出版社官网中的期刊页。在网页空白处单鼠标右键,选择快捷菜单中的“查看页面源代码”即可打开当前网页的源代码信息页面。

网页中的源代码形式与第14章的HTML代码形式基本相同,读者可尝试阅读网页中的源代码。通过源代码可以轻松地获取网页中的文字、图片、视频等信息,还可以获取图片或视频文件的url并将文件下载到本地。

而一个网页除了HTML代码还包含]avaScript脚本语言代码,JavaScript脚本语言代码使得浏览器可以解析和渲染网页源代码,使得用户可以阅览到图形化界面,而不是阅读纯文本代码。网页中有大量数据是包含在JavaScript脚本语言代码中的,而通过査看源代码的方式是无法获取这些数据的。例如图15-4中的图片信息在网页源代码中是无法找到的,但可以通过检查窗口查看渲染后的网页内容,找到对应图片的url。

获取人民邮电出版社官网中期刊页的《通信学报》封面图片url的步骤如下,步骤1,单击检查窗口中的元素选择按钮,如图15-6所示的标注框所在位置内的图标。步骤2,单击网页中的图片位置,检查窗口将会自动跳转到该图片对应的源代码位置。
步骤3,浅蓝色部分的<img upload/2017/06/53def7a9b43044a1b1afd1991d82a323.png>为图片的源代码内容,其中upload/2017/06/53def7a9b43044a1b1afd1991d82a323.png为图片在网站服务器中的目录地址,完整的ur1只需要在前面加入网站主域名即可。

获取网页资源

requests库具有获取网页内容和向网页中提交信息的功能,本节主要介绍如何获取网页内容及如何对获取的网页内容进行处理。

get()函数

在requests库中获取HTML网页内容的方法是使用get()函数。其使用形式如下:

get (url, params=None, **kwargs)

参数url:表示需要获取的HTML网址(也称为url)。
参数params:表示可选参数,以字典的形式发送信息,当需要向网页中提交查询信息时使用。

参数**kwargs:表示请求采用的可选参数。

返回值:返回一个由类Response创建的对象。类Response位于requests库的models.py文件中。

示例代码:

import requests

r=requests.get('https://www.ptpress.com.cn/')

print(r.text)

第1行代码导入了requests库。

第2行使用requests库中的get()函数获取人民邮电出版社的官方网址,并返回一个Response对象给变量r。

第3行代码使用print()语句输出变量r的text方法,Response对象中的text方法用于获取相应的文本内容即网页的源代码。

执行代码后的输出结果如图15-7所示,“Squeezed text(1019line).”表示获取的内容较多,IDLE会自动将内容收缩起来,可以用鼠标右键单击此处并选择“view”查看返回的完整信息,如图15-8所示。对比使用代码输出的信息和使用浏览器访问的网页源代码,它们的内容是相同的。

get()搜索信息

当在网页中搜索人民邮电出版社中的某些指定信息时,可以在图15-9所示的搜索框中输入搜索信息,例输入关键词“Excel”。

从搜索结果网页中可以看到当前页面的网址为https://www.ptpress.com.cn/search?keyword=excel其中https://www.ptpress.com.cn/为官网主页,search表示搜索,keyword表示搜索的关键词(这里值为
excel,表示需要搜索的关键词为“excel”),“?”用于分隔search和keyword。

在其他网页中搜索也有与以上类似的效果,search或keyword可能会用其他字符表示,但基本形式是相同的。读者可在其他网页中进行尝试,例如使用百度的网址+s?wd=excel可以搜索到关键词为“excel”的内容其中s为search的缩写,wd为word的缩写。

在requests库中可以充分利用以上方法实现获取网页中的资源。

示例代码:

import requests

r=requests.get('https://www.ptpress.com.cn/search?keyword=word')

print(r.text)

第2行代码用于实现在人民邮电出版社官网中搜索关键词为“word”的信息

get()添加信息

get()函数中第2个参数params会以字典的形式在ur1后自动添加信息,需要提前将params定义为字典示例代码:

import requests

info ={'keyword':'Excel'}

r=requests.get('https://www.ptpress.com.cn/search',params=info)

print(r.url)

print(r.text)

第2行代码建立字典info,包含一个键值对。

第3行代码使用get()函数获取网页,由于get()中包含参数params,因此系统会自动在url后添加字典信息形式为https://www.ptpress.com.cn/search?keyword=exce1,该使用形式便于灵活设定需要搜索的信息即可以添加或删除字典信息。

第4行代码输出返回的Response对象中的url,即获取网页的url。

返回 Response 对象

通过get()函数获取HTML网页内容后,由于网页的多样性,通常还需要对网页返回的Response对象进行设置。本小节将主要讲解类Response中的方法。

Response 的属性

Response包含的属性有status_code、headers、url、encoding、cookies等。

status_code(状态码):当获取一个HTML网页时,网页所在的服务器会返回一个状态码,表明本次获取网页的状态。例如访问人民邮电出版社官网,当使用get()函数发出请求时,人民邮电出版社官网的服务器接收到请求信息后,会先判断请求信息是否合理,如果请求合理则返回状态码200和网页信息;如果请求不合理则返回一个异常状态码。

常见的HTTP(Hypertext Transfer Protocol,超文本传送协议)状态码有200(请求成功)、301(网页内容被永久转移到其他url)、404(请求的网页不存在)、500(内部服务器错误)等,更多状态码可以使用搜索引擎查询。

因此在使用get()函数请求访问网页时,为了确保获取正确的网页信息,需要判断服务器返回的状态码是否为200。Response对象中的status_code为服务器返回的状态码。

示例代码:

import requests

r=requests.get('https://www.ptpress.com.cn')

print(r.status_code)

if rstatus_code == 200:

        print(r.text)

else:

        print('本次访问失败')

第3行代码输出Response对象返回的状态码。第4行代码用于判断状态码是否为200,如果为200,则输出获取的网页内容,否则表明访问存在异常。

header(响应头):服务器返回的附加信息,主要包括服务器传递的数据类型、使用的压缩方法、语言、服务器的信息、响应该请求的时间等。

url:响应的最终url位置。

encoding:访问r.text时使用的编码。

设置编码

当访间一个网页时,如果获取的内容是乱码,例如图15-12所示的内容为访间百度官网后返回的信息,其中存在大量的乱码信息。这是由网页读取编码错误导致的,可以通过设置requests.get(url)返回的Bespons对象的encoding='utr-8"来修改“Response对象.text”文本内容的编码方式。同时Response对象中提供了apparent_encoding()方法来自动识别网页的编码方式,不过由于此方法是由机器自动识别,因此可能会存在识别错误的情况(大部分情况下是可用的)。

如果要设置自动识别网页的编码方式,可以使用以下形式:

Response对象.encoding=Response对象,apparent_encoding

import requests

r=requests.get('此处填入'百度官网地址'.com')

r.encoding =r.apparent encoding

print(r.text)

第3行代码设置自动识别网页的编码方式,执行代码后的输出结果中将包含可识别的文字,而不再是乱码,如图15-13所示。当设置自动识别编码方式后依然出现内容乱码时,读者需要自行设置encoding编码方式。

返回网页内容

Response对象中返回网页内容有两种方法,分别是te缁爍氮xt総()方法和content()方法,其中text()方法在前面的内容中有介绍,它是以字符串的形式返回网页内容。而content()方法是以二进制的形式返回网页内容,常用于直接保存网页中的媒体文件。

示例代码(下载人民邮电出版社官网中的图片):

import requests

r=requestsget('https://cdn.ptpress.cn/uploadimg/Materia1/978-7-115-41359-8/72jpg/4135jpg')

f2 = open('b.jpg','wb')

f2.write(r.content)

f2.close()

第2行代码使用get()方法访问了图片url。

第3行代码使用open()函数创建了一个bjpg文件,并且设置以二进制写入的模式

第4行代码将获取的url内容以二进制形式写入文件。
执行代码后将在相应文件夹中存储一张图片.

提交信息到网页

requests库除了可以从网页中获取资源,还可以将信息提交到网页中,本节将主要介绍如何使用实现将信息上传到网站服务器中。

浏览器提交请求

在15.3节中介绍了如何通过requests库获取网页的内容,而当需要向网页中提交信息时,可以requests库中的post()函数来实现,提交内容包含表单、图片、文件等类型的数据。

可以在浏览器的检查窗口中观察到数据提交的过程。以在人邮教育社区中修改用户密码为例,观察浏览器提交数据的步骤如下。
步骤1,登录用户账户后,进入修改密码界面,如图15-18所示。需要在指定位置输入当前密码和新密码,这种文本框中的数据称为表单信息。

步骤2,在网页空白处单击鼠标右键并进入检查窗口,单击“Network”进入Network窗口,接下来在网页中输入用户的当前密码、新密码、确认密码,并单击“修改密码”按钮,如图15-19所示。

步骤3,提交信息后,在右边的Network窗口中将不断获取网页交互的信息。

为骤4,找到提交密码的交互信息。在Name窗口中单击"change-password”,观察其"Hearders”选
不的售息、可以发现在:G2neral”区城中的RequestManna(更示情2d”、码务法)(为POST,书信息是通过P09请求来提交数据的,如图15-21所示。而在最0(的示请来网D3万花设单数据)区城中了刚刚输入的密码,其中OldPassword对应网页中的当前密码。的“pa.Dza对应网页中的新密码。8frmPaswOHd对应网页中的确认密码,它们的值正好为用户限刚输入P&8”0n1522所示。由此可以CmName窗口中的change-password是提交给服务器的信息。

以上内容是使用浏览器实现通过p0St请求提交数据的过程,接下来介绍使用requests库模拟浏览器提交调。,实现通过post请求将表单中的数据提交给服务器。

post()函数

post()函数可用于向网站发送数据请求。其使用形式如下:

bost (url,data=None, json=None, **kwargs)

参数url:表示网站url。
参数data:表示需要发送的数据对象,可以为字典、元组、列表、字节数据或文件。
参数json:表示需要发送的数据对象,该数据对象为JSON数据(具体内容见17.3节)。
参数**kwargs:表示请求采用的可选参数。
返回值:使用post()函数后返回一个Response对象。
示例代码:

import requests

d=('0ldpassword':'123456python','Newpassword':'123python','conflrmpassword' :'123python' }

r=requests.post('https://account.ryjiaoyu.com/change-password', data-d)

print(z.text)

第2行代码使用字典的形式保存了需要上传的数据。

第3行代码使用post()函数访问修改密码网页ur,并提交修改密码数据。

执行此代码后本质上还无法完成使用代码修改密码,因为在修改密码前还需要登录账户,这里代码并没有实现账户的登录,此处仅展示上传表单数据的方法。

http://www.lryc.cn/news/591186.html

相关文章:

  • 【前沿技术动态】【AI总结】Spring Boot 4.0 预览版深度解析:云原生时代的新里程碑
  • 比特币技术简史 第三章:区块链技术 - 区块结构、链式结构与工作量证明
  • Spark 之 HashJoin
  • CDSS系统升级“可视化解释-智能反馈-临床语言“三位一体设计架构设计分析
  • (自用)补充说明2
  • 【组件库】VanillaTilt.js使用教程和配置项说明
  • C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
  • 【Python练习】046. 编写一个函数,检查一个数组是否是排序的
  • 算法学习笔记:27.堆排序(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 【agent实战】基于 LangGraph 实现 Agentic RAG:原理、实战与创新全解
  • Java集合处理库——collection-complete
  • React Native 基础tabBar和自定义tabBar - bottom-tabs
  • React hooks——useMemo
  • Android离线TTS实战——集成espeak-ng实现开箱即用的中文语音播报
  • Flutter:上传图片,选择相机或相册:wechat_assets_picker
  • 玖[9],相机/镜头/光源
  • 2021-07-21 VB窗体求范围质数(Excel复制工作簿)
  • Java使用FastExcel实现模板写入导出(多级表头)
  • 在Anaconda Prompt中安装库【保姆教程】
  • 使用flock单进程启动,仍然有多个同名进程可以同时运行
  • 苹果的机器学习框架将支持英伟达的CUDA平台
  • web后端开发(javaweb第十天)
  • 【后端】Linux系统发布.NetCore项目
  • suricata新增Mysql告警规则处理
  • Zemax坐标断点
  • GitHub开源轻量级语音模型 Vui:重塑边缘智能语音交互的未来
  • 【git 如何查看本地分支与远程分支之间的差异】
  • Oracle11.2.0.4 RAC迁移升级Oracle19.3 RAC
  • 单片机(STM32-时钟系统)
  • AI 智能质检系统在汽车制造企业的应用​