Python网络爬虫

requests库

自动爬取HTML页面,自动网络请求提交

1
2
3
4
5
6
7
8
9
requests库的安装小测:

#导入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
#导入requests库
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() #如果状态不是200,英法HTTPError异常
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
#requests库的head()方法
import requests

r = requests.head("https://baidu.com")
print("请求的头部内容为:\n", r.headers)
print("请求的html内容为:\n", r.text) #输出为空
#所用head可以更加节约网络资源地去获取网络概要信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#requests库的post()方法

import requests
payload = {'key1': 'value1', 'key2': 'value2'} #字典 键值对
r = requests.post('http://httpbin.org/post', data = payload)
print(r.text)
## 向URL POST一个字典,自动编码为from表单 跟put()方法一样,不过会将原有地数据覆盖掉
# {  ...
# "form": {
# "key2": "value2",
# "key1": "value1"
# },
# ...
# }
1
2
3
4
5
6
7
8
9
10
11
12
#requests库地post()方法

import requests
r = requests.post('http://httpbin.org/post', data = 'ABC') #字符串
print(r.text)
## 向URL POST一个字符串,自动编码为data
# {
# ...
# "data": "ABC",
# "form": {},
# ...
# }
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证书路径