Python网络爬虫
requests库
自动爬取HTML页面,自动网络请求提交
1 2 3 4 5 6 7 8 9
| requests库的安装小测:
import requests
r = requests.get("https://baidu.com") print("r的类型为:\n", type(r)) print("状态码为:\n", r.status_code) print("html内容为:\n", r.text)
|
requests库的7个主要方法
方法 |
说明 |
requests.request() |
构造一个请求,支撑以下各方法的基础方法 |
requests.get() |
获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() |
获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() |
向HTML页面提交POST请求的方法,对应于HTTP的POST |
requests.put() |
向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() |
向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() |
向HTML页面提交删除请求,对应于HTTP的DELETE |
1 2 3 4 5 6 7 8 9 10
| requests.get()
r = requests.get(url) 构造一个向服务器请求资源的Request对象 返回一个包含服务器资源的Response对象,Response对象包含爬虫返回的内容
requests.get(url, params=None, **kwargs) url 拟获取页面的URL链接 params url中的额外参数,字典或字节流格式,可选 **kwargs 12个控制访问的参数
|
Response对象的属性
属性 |
说明 |
r.status_code |
HTTP请求的返回状态,200表示连接成功,404或其他表示失败 |
r.text |
HTTP响应内容的字符串形式,即URL对应的页面内容 |
r.encoding |
从HTTP header中猜测响应内容的编码方式(查看的的头部的charset,不准确,默认编码为ISO‐8859‐1) |
r.apparent_encoding |
从内容中分析出响应内容的编码方式(备选编码方式,比较准确) |
r.content |
HTTP响应内容的二进制形式(例如图像) |
1 2 3 4 5 6 7 8 9 10 11 12 13
| import requests
r = requests.get("https://baidu.com") print("r的类型为:\n", type(r))
print("状态码为:\n", r.status_code) print("html内容为:\n", r.text) print("网页的编码方式为:\n", r.encoding) print("网页的备选编码方式为:\n", r.apparent_encoding)
r.encoding = 'utf-8' print("html内容为:\n", r.text)
|
requests.get()网络连接可能有风险会抛出异常
requests库的异常 |
说明 |
requests.ConnectionError |
网络连接错误异常,如DNS查询失败,拒绝连接等 |
requests.HTTPError |
HTTP错误异常 |
requests.URLRequired |
URL缺失异常 |
requests.TooManyRedirects |
超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout |
连接远程服务器超时异常 |
requests.Timeout |
请求URL超时,产生超时异常 |
r.raise_for_status() |
如果不是200,产生异常requests.HTTPErrot。在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try-except进行异常处理。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 爬取网页的通用代码框架
import requests
def getHTMLText(url): try: r = requests.get(url, timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "产生异常"
if __name__ == "__main__": url = "https://www.baidu.com" print(getHTMLText(url))
|
HTTP 超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态【第一次请求与第二次请求没有关联】的应用层协议【HTTP协议工作在TCP协议之上】。采用URL作为定位网络资源的标识,URL格式如下:
1
| http://host[:port][path]
|
PATCH与PUT的区别
假设URL位置有一组数据UserInfo,包括UserId、UserName等20个字段
需求:用户修改了UserName,其他不变
- 采用PATCH,仅向URL提交UserName的局部更新请求
- 采用PUT,必须将所有20个字段一并提交到URL,未提交的字段将会被删除
PATCH优点:节省网络宽带
1 2 3 4 5 6 7
| import requests
r = requests.head("https://baidu.com") print("请求的头部内容为:\n", r.headers) print("请求的html内容为:\n", r.text)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
import requests payload = {'key1': 'value1', 'key2': 'value2'} r = requests.post('http://httpbin.org/post', data = payload) print(r.text)
|
1 2 3 4 5 6 7 8 9 10 11 12
|
import requests r = requests.post('http://httpbin.org/post', data = 'ABC') print(r.text)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| requests.requests(method, url, **kwargs) method 请求方式,对应有GET/HEAD/POST/PUT/PATCH/DELETE/OPTIONS(获取服务器跟客户端能够打交道的参数)一共7种 url 拟获取页面的url链接 **kwargs 访问控制的参数,共13个,可选项 params 字典或字节序列,作为参数增加到url中 >>> kv={'key1':'value1','key2':'value2'} >>> r=requests.request('GET','http://python123.io/ws',params=kv) >>> print(r.url) http://python123.io/ws?key1=value1&key2=value2 data 字典、字节序列或文件对象,作为Requests的内容 >>> kv={'key1':'value1','key2':'value2'} >>> r=requests.request('POST','http://python123.io/ws',data=kv) >>> body='主体内容' >>> r=requests.request('POST','http://python123.io/ws',data=body) json JSON格式的数据,作为Requests的内容 >>> kv={'key1':'value1'} >>> r=requests.request('POST','http://python123.io/ws',json=kv) headers 字典,HTTP定制头 >>> hd={'user‐agent':'Chrome/10'} >>> r=requests.request('POST','http://python123.io/ws',headers=hd) cookies 字典或CookieJar,Requests中的cookie auth 元组,支持HTTP认证功能 files 字典类型,传输文件 >>> fs={'file':open('data.xls','rb')} >>> r=requests.request('POST','http://python123.io/ws',files=fs) timeout 设定超时时间,秒为单位 >>> r=requests.request('GET','http://www.baidu.com',timeout=10) proxies 字典类型,设定访问代理服务器,可以增加登录认证(可以隐藏源,防止逆追踪) >>> pxs={'http':'http://user:pass@10.10.10.1:1234' 'https':'https://10.10.10.1:4321'} >>> r=requests.request('GET','http://www.baidu.com',proxies=pxs) allow_redirects True/False,默认为True,重定向开关 stream True/False,默认为True,获取内容立即下载开关 verify True/False,默认为True,认证SSL证书开关 cert 本地SSL证书路径
|