初学Python网络爬虫
1、背景
内容主要参考北京理工大学嵩天老师的《Python网络爬虫与信息提取》课程,不想看视频,自学能力强的就直接看PPT了
课程实例如下:
python开发工具选择为:pycharm+Anaconda
2、爬虫规则
Request库——自动爬取HTML页面、自动网络请求提交
(1)安装Request库
安装略过,测试代码如下:
// 爬虫代码示例1
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code)
print(r.text)
结果如下:
现在还暂时看不懂这些代码及结果,先不管。
Requests库的7个主要方法如下所示:
(2)Requests库的get()
其中,Response对象包含爬虫返回的内容,具体参数如下:
// 爬虫代码示例2
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code)
# print(r.text)
print(type(r))
print(r.headers)
结果如下所示:
200
<class 'requests.models.Response'>
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 16 Jan 2021 11:34:03 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:29 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
所以Response对象包含服务器返回的所有信息,也包含请求的Request信息。
a. Response对象的属性
简单来说,首先用r.status_code看一看返回的是不是200,是的话才能用r.text、r.encoding、r.apparent_encoding、r.content,否则返回的是404的话,可能是某些原因出错产生异常。
一个demo如下:
下面理解一下Response的编码
r.encoding——如果header中不存在charset,则认为编码为ISO-8859-1
r.text根据r.encoding显示网页内容r.apparent_encoding——根据网页内容分析出的编码方式可以看作是r.encoding的备选
b. 爬取网页的通用代码框架
首先需要理解Requests库的异常,因为网络连接是有风险的:
r.raise_for_status()在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try‐except进行异常处理
爬取网页的通用代码框架如下:
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
注意! url = "www.baidu.com"会报错
(3)HTTP协议及Requests库方法
HTTP协议:Hypertext Transfer Protocol,超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议,协议采用URL作为定位网络资源的标识,URL格式如下:
其中:
参数名 | Value |
---|---|
host | 合法的Internet主机域名或IP地址 |
port | 端口号,缺省端口为80 |
path | 请求资源的路径 |
URL实例例如:
- http://www.bit.edu.cn
- http://220.181.111.188/duty
简单来说,URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
下面介绍HTTP协议对资源的操作:
通过URL和命令管理资源,操作独立无状态,网络通道及服务器成为了黑盒子
HTTP协议与Requests库功能是一致的,可以认为六种方法是等价的。
(4)Requests库主要方法解析
requests.request(method,url,**kwargs)
method : 请求方式,对应get/put/post等7种
- r = requests.request(‘GET’,url,**kwargs)
- r = requests.request(‘HEAD’,url,**kwargs)
- r = requests.request(‘POST’,url,**kwargs)
- r = requests.request(‘PUT’,url,**kwargs)
- r = requests.request(‘PATCH’,url,**kwargs)
- r = requests.request(‘delete’,url,**kwargs)
- r = requests.request(‘OPTIONS’,url,**kwargs)
url: 拟获取页面的url链接
**kwargs: 控制访问的参数,共13个,控制访问的参数,均为可选项
- params: 字典或字节序列,作为参数增加到url中
- data : 字典、字节序列或文件对象,作为Request的内容
- json: JSON格式的数据,作为Request的内容
- headers : 字典,HTTP定制头
- cookies : 字典或CookieJar,Request中的cookie
- auth: 元组,支持HTTP认证功能
- files : 字典类型,传输文件
- timeout : 设定超时时间,秒为单位
- proxies : 字典类型,设定访问代理服务器,可以增加登录认证
- allow_redirects: True/False,默认为True,重定向开关
- stream : True/False,默认为True,获取内容立即下载开关
- verify : True/False,默认为True,认证SSL证书开关
- cert: 本地SSL证书路径
不用记住。总而言之,**kwargs: 控制访问的参数,均为可选项 。
之前的get函数:
内容参考来源: Python网络爬虫与信息提取.