目录
1.网络爬虫介绍
网络爬虫通俗来讲就是使用代码将 HTML 网页的内容下载到本地的过程。爬取网页主要是为了获取网页中的关键信息,例如网页中的数据、图片、视频等。Python 语言中提供了多个具有爬虫功能的库,在学习和实践过程中一定要严格遵守网站提供的爬取规则。
1 网络爬虫库
urllib
库:是 Python 自带的标准库,无须下载、安装即可直接使用。urllib
库中包含大量的爬虫功能,但代码编写略显复杂。requests
库:是 Python 的第三方库,需要下载、安装之后才能使用。由于requests
库是在urllib
库的基础上建立的,它包含urllib
库的功能,这使得requests
库中的函数和方法的使用更加友好,因此requests
库的代码看起来更加简洁、方便。scrapy
库:是 Python 的第三方库,需要下载、安装之后才能使用。scrapy
库是一个适用于专业爬虫开发的网络爬虫库。scrapy
库集合了爬虫的框架,通过框架可创建一个专业爬虫系统。selenium
库:是 Python 的第三方库,需要下载、安装后才能使用。selenium
库可用于驱动计算机中的浏览器执行相关命令,而无须用户手动操作。常用于自动驱动浏览器实现办公自动化和 Web 应用程序测试。
这里我主要介绍requests
库和后面的selenium
库,如果感兴趣可以再去学习更高深的scrapy
库,这两个库学好足够人工智能领域使用了。
2.robots.txt 规则
我们需要掌握爬取规则,不是网站中的所有信息都允许被爬取,也不是所有的网站都允许被爬取。在大部分网站的根目录中存在一个robots.txt
文件,该文件用于声明此网站中禁止访问的 url 和可以访问的 url。用户只需在网站域名后面加上/robots.txt
即可读取此文件的内容。以豆瓣为例。下面就是豆瓣的robots规则,disallow就是表示不允许被爬取的文件。
2.requests 库和网页源代码
1.requests 库的安装
pip install requests
2.网页源代码
打开网页右击就可以看到查看页面源代码
3.获取网页资源
requests
库具有获取网页内容和向网页中提交信息的功能,我主要介绍如何获取网页内容及如何对获取到的内容进行处理。
1. get () 函数
requests
库获取 HTML 网页内容的方法是使用get()
函数。其使用形式如下:
requests.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.) get()
搜索信息
当在网页中搜索人民邮电出版社中的某些指定信息时,可以在搜索框中输入搜索信息,例如输入关键词 “java”, https://www.ptpress.com.cn/search?keyword=excel从搜索结果网页中可以看到当前页面的网址为 https://www.ptpress.com.cn/search?keyword=excel 。search
表示搜索,keyword
表示搜索的关键词(这里为java,表示需要搜索的关键词为 “java”),?
用于分隔search
和keyword
。
import requests
r = requests.get('https://www.ptpress.com.cn/search?keyword=word')
print(r.text)
第 2 行代码用于实现在人民邮电出版社官网中搜索关键词为 “word” 的信息。
(2.) get()
添加信息
get()
函数中第 2 个参数params
会以字典的形式在url
后自动添加信息,需要提前将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=excel
,该使用形式便于灵活设定需要搜索的信息,并且可以添加或删除字典信息。
第 4 行代码输出返回的Response
对象中的url
,即获取网页的url
。
2.返回 Response 对象
通过get()
函数获取 HTML 网页内容后,由于网页的多样性,通常还需要对网页返回的Response
对象进行处理。
(1).Response 的属性
Response
包含的属性有status_code
、headers
、url
、encoding
、cookies
等。
status_code
(状态码):当获取一个 HTML 网页时,网页所在的服务器会返回一个状态码,表明本次获取网页的状态。例如访问人民邮电出版社官网,当使用get()
函数发出请求时,人民邮电出版社官网的服务器接收请求信息后,会先判断请求信息是否合理,如果请求合理则返回状态码 200 和网页信息;如果请求不合理则返回一个异常状态码。
状态码 | 类别 | 含义 |
---|---|---|
100 | 信息性状态码 | 继续。客户端应继续其请求。 |
101 | 信息性状态码 | 切换协议。服务器根据客户端的请求切换协议。 |
200 | 成功状态码 | 成功。请求已成功处理。 |
301 | 重定向状态码 | 永久移动。请求的资源已永久移动到新 URL。 |
302 | 重定向状态码 | 临时移动。请求的资源临时移动到新 URL。 |
304 | 重定向状态码 | 未修改。资源自上次请求后未修改,可以使用缓存版本。 |
400 | 客户端错误状态码 | 错误请求。服务器不理解请求的语法。 |
401 | 客户端错误状态码 | 未授权。请求需要身份验证。 |
403 | 客户端错误状态码 | 禁止访问。服务器理解请求客户端的请求,但是拒绝执行此请求。 |
404 | 客户端错误状态码 | 未找到。请求的资源不存在。 |
405 | 客户端错误状态码 | 方法禁用。禁用请求中指定的方法。 |
408 | 客户端错误状态码 | 请求超时。服务器等待请求超时。 |
429 | 客户端错误状态码 | 请求过多。用户在给定的时间内发送了太多请求。 |
500 | 服务器错误状态码 | 内部服务器错误。服务器遇到错误,无法完成请求。 |
501 | 服务器错误状态码 | 尚未实施。服务器不支持请求的功能,无法完成请求。 |
502 | 服务器错误状态码 | 错误网关。服务器作为网关或代理,从上游服务器收到无效响应。 |
503 | 服务器错误状态码 | 服务不可用。服务器目前无法使用(由于超载或停机维护)。 |
504 | 服务器错误状态码 | 网关超时。服务器作为网关或代理,但是没有及时从上游服务器收到请求。 |
import requests
r = requests.get('https://www.ptpress.com.cn/')
print(r.status_code)
if r.status_code == 200:
print(r.text)
else:
print('本次访问失败')
headers
(响应头):服务器返回的附加信息,主要包括服务器传递的数据类型、使用的压缩方法、语言、服务器的信息、响应该请求的时间等。
url
:响应的最终url
位置。
encoding
:访问r.text
时使用的编码。
cookies
:服务器返回的文件。这是服务器为辨别用户身份,对用户操作进行会话跟踪而存储在用户本地终端上的数据
(2).设置编码
当访问一个网页时,如果获取的内容是乱码,这是由网页返回的编码错误导致的,可以通过设置requests.get(url)
返回的Response
对象的encoding
属性来修改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).返回网页内容
Response
对象中返回网页内容有两种方法,分别是text()
方法和content()
方法,其中text()
方法在前面的内容中有介绍,它是以字符串的形式返回网页内容。而content()
方法是以二进制的形式返回网页内容,常用于直接保存网页中的媒体文件。
import requests
r = requests.get('https://cdn.ptpress.com.cn/uploading/Material/978-7-115-41359-8/72jpg/41359_1.jpg')
f2 = open('b.jpg', 'wb')
f2.write(r.content)
f2.close()
下载人民邮电出版社官网中的图片,执行代码后将在相应文件夹中存储一张图片
4.提交信息到网页
requests
库除了可以从网页中获取资源,还可以使用post()
请求实现将信息上传到网站服务器中。
1.post () 函数
post()
函数可用于向网站发送数据请求。其使用形式如下:
requests.post(url, data=None, json=None, **kwargs)
- 参数
url
:表示需要发送数据的目标网址。 - 参数
data
:表示需要发送的数据对象,可以为字典、元组、列表、字节数据或文件。 - 参数
json
:表示需要发送的数据对象,该数据对象为 JSON 数据(具体内容见 17.3 节)。 - 参数
**kwargs
:表示请求采用的可选参数。
返回值:使用post()
函数后返回一个Response
对象。
import requests
d = {'OldPassword':'123456python', 'NewPassword':'123python', 'ConfirmPassword':'123python'}
r = requests.post('https://account.ryjiaoyu.com/change-password', data=d)
print(r.text)
第 2 行代码使用字典的形式保存了需要上传的数据。
第 3 行代码使用post()
函数访问修改密码网页url
,并提交修改密码数据。
执行代码后本质上还无法完成使用代码修改密码,因为在修改密码前还需要登录账户,这里代码并没有实现账户的登录,此处仅展示上传表单数据的方法。
2.上传文件的方法
如果需要将文件上传到网页中,可以使用files
参数,该参数的内容为文件对象。
import requests
fp = {'file':open('bitbug.ico', 'rb')} # 上传的图片
r = requests.post('可上传图片的网址', files=fp)
print(r.text)
第 2 行代码创建了一个字典fp
,其中键"file"
对应的值为使用open()
函数打开的图片对象。
第 3 行代码使用了post()
函数上传这张图片,执行代码后会将此图片上传到网站服务器。
5.代理服务器
1.获取代理服务器
当爬取某些网站的网页资源时,如果请求次数较少,一般能正常获取内容,但是一旦开始大规模且频繁地爬取数据,网站可能会弹出验证码对话框,或者跳转到登录认证页面,甚至可能直接封禁客户端的 IP(Internet Protocol)地址,导致用户在一定时间段内无法再次访问该网站。为避免此种情况,可以使用代理服务器获取网。
代理服务器是介于客户端和网站服务器之间的一台中转站服务器。代理服务器的工作流程是客户端向代理服务器发出url
请求,代理服务器接收到请求后,向指定服务器发出url
请求,并将获取的网页返回给客户端,而不是直接从客户端到服务器获取网页。当客户端频繁爬取某个网站的信息时,由于中间使用了代理服务器,代理服务器会直接从服务器获取网页内容。
2.使用代理服务器
将get()
、post()
函数中的第 3 个参数设置为proxies
,即表示使用代理服务器。
import requests
proxie = {'http':'http://代理服务器地址:ip'}
r = requests.get('https://www.ryjiaoyu.com/', proxies=proxie)
print(r.text)
第 2 行代码创建了一个字典,字典中的键http
对应的值表示一个免费的代理服务器。
第 3 行代码在get()
函数中填入参数proxies
,且其值为字典proxie
,表示在访问人民邮电出版社社区官网时,会通过 IP 地址为 115.29.199.16:8118 的代理服务器来间接访问。代理服务器获取到网页内容后,会将网页内容转发给客户端。