1.3 请求库 -- requests库的使用
reuqests 请求库 — 基础应用
1.requests请求库介绍
1 # 介绍: 2 urllib请求库中提供的模块和方法可以基本满足我们爬取数据的需求,但它使用起来比较繁琐,比如处理网页验证和Cookies时,需要写Opener和Handler来处理。为了更加方便地实现这些操作,就有了更为强大的库requests,有了它,Cookies、登录验证、代理设置等操作都显得比较从容优雅了。 3 4 # 安装: 5 pip install requests
2.requests支持的请求方法
requests模块支持post, get, put, delete, head, options等请求方式, 实际上爬虫程序中常用的就是get和post请求方式.
3.requests — get请求
1 1.requests的get方法如下: 2 requests.get(url,params=None,**kwargs) 3 url:要请求的服务器地址 4 params:请求参数 5 **kwargs:动态位置参数,一般会传请求头中的User-Agent 6 7 2.模拟请求百度,搜索关键字"爬虫" 8 import requests 9 10 # 构建请求的url 11 url ="https://www.baidu.com/s?" 12 13 # 设置请求头的UA 14 headers ={ 15 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' 16 } 17 18 # 定义参数, 搜索关键字为爬虫 19 param ={ 20 'wd':"爬虫" 21 } 22 23 # 请求百度服务器 24 response = requests.get(url=url,params=param, headers=headers) 25 print(response.text)# 打印数据结果
4.requests — post请求
1 # 1.requests的post请求方法如下: 2 requests.post(url=url, data=data, json=None,**kwargs) 3 url:请求的url地址 4 data:请求参数 5 json:默认参数 6 **kwargs:动态关键字参数,可以传入headers 7 8 # 2.模拟请求http://httpbin.org/post, 并传入formdata数据为{'name': 'germey', 'age': '22'} 9 import requests 10 data ={'name':'germey','age':'22'} 11 r = requests.post("http://httpbin.org/post", data=data) 12 print(r.text)
5.三种数据的抓取及对应解析
(1)在爬取数据中一般分为三种数据类型: 文本类型, json类型, 二进制数据流
(2).三种数据类型对应解析方式:
1).文本类型 — response.text
2).json类型 — response.json()
3).二进制数据流 — response.content()
(response是响应对象, 通过text可以得到文本类型的文本, json可以得到序列化数据, content可以得到二进制数据流)
request 请求库 — 高级应用
1.文件上传操作(使用场景较少)
requests模块可以向服务器提交数据, 当然requests也可以像服务器提交文件.
1 import requests 2 url ="http://httpbin.org/post" 3 files ={'file': open('mypicture.jpg','rb')} 4 r = requests.post(url=url, files=files) 5 print(r.text)
2.Cookies的处理
Cookies被包含在请求头中, 所以处理Cookies的思路是在headers中设置Cookies的简直对
1 import requests 2 3 # 设置请求头信息, 内部包含UA和Cookies 4 headers ={ 5 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36', 6 'Cookies':'BAIDUID=79A570F8D90B2C45E42D40A3666ADC46:FG=1; BIDUPSID=79A570F8D90B2C45E42D40A3666ADC46; PSTM=1551074009; BD_UPN=12314753; BDUSS=g0QUVVcGJiY2FaUWhQT1VPQWJlRW5oN2V2eW5PVDVsa2x4WUV4RUg5aUFpUlJkRVFBQUFBJCQAAAAAAAAAAAEAAABwfMtW09rQodPjMDgyMGZyZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAID87FyA~OxcaX; B64_BOT=1; cflag=13%3A3; BD_HOME=1; BDRCVFR[n9IS1zhFc9f]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=2; BDRCVFR[qvT0xz2ZIzc]=mk3SLVN4HKm; H_PS_PSSID=1452_21117_29063_28519_29099_29139_28831_28584; BDRCVFR[EJqU0HkOX2D]=mbxnW11j9Dfmh7GuZR8mvqV; shifen[100846344216_32166]=1559294031; BCLID=8536685883861864975; BDSFRCVID=i14OJeC624Goeqv9PXrBuyYwylGFKQoTH6aoKKyozKPxaCXLkQcVEG0Pjx8g0KAbk4cGogKK0mOTHv8F_2uxOjjg8UtVJeC6EG0P3J; H_BDCLCKID_SF=tJFDVIthfIP3jbIk-Pnfbtu_hgT22jn0tRn9aJ5nJD_Msn7NKJDB0hkXLlo8XRb8agvlaMjOQpP-HJ7oynro2xPr2MQmXU7WLC7pKl0MLncWbb0xyUQDMT0SQUnMBMPjamOnaPLy3fAKftnOM46JehL3346-35543bRTohFLK-oj-DDxD5-W3e; sugstore=0; COOKIE_SESSION=1746_1_6_4_7_14_0_3_2_5_95_0_3107_0_0_0_1559134108_1559294112_1559304830%7C9%230_1_1559294027%7C1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDSVRTM=0' 7 } 8 url ='https://www.baidu.com/s?' 9 10 # 构建提交的搜索参数 11 params ={ 12 'wd':'爬虫' 13 } 14 15 response = requests.gett(url=url,params=params, headers=headers) 16 print(response.text)
3.会话的维持
在真实用户通过浏览器访问服务器获取资源的过程中, 一部分网站时要求用户每次访问携带cookies的, 这样服务器通过cookies来判别用于的上一次会话状态, 从而实现会话的维持. Cookies的获取, 存储, 以及访问携带Cookies的过程和细节对真实用户是隐藏的, 真实用户是感知不到的.
但对于爬虫程序来说就要自己实现这个过程了, 从而维持会话. 在requests模块中就用到了session来维持会话, session会自动获取Cookies, 并且下一次访问自动封装Cookies. 值得注意的是, 要维持会话, 这个访问过程不能间断, 即要一直使用session进行访问.
1 import requests 2 3 # 实例化一个session对象 4 s = requests.Session() 5 6 # 使用session对象进行请求 7 s.get('http://httpbin.org/cookies/set/number/123456789') 8 9 # 要想一致保持会话, 每一次请求都要使用session对象进行请求 10 r = s.get('http://httpbin.org/cookies') 11 print(r.text)
4.SSL证书验证
requests还提供了证书验证的功能。当发送HTTP请求的时候,它会检查SSL证书,我们可以使用verify参数控制是否检查此证书。其实如果不加verify参数的话,默认是True,会自动验证。把verify参数设置为False即可.
1 import requests 2 3 # 把verify设置为False便不会进行证书的验证了, 就不会抛出SSLError异常 4 response = requests.get('https://www.12306.cn', verify=False) 5 print(response.status_code)
5.代理设置
爬虫程序一般是要请求大量数据的, 虽然是模拟浏览器人工请求数据, 但请求的数据量与频率是不可能像正常用户请求的, 这样一来服务器监测到我们的爬虫程序, 很有可能就被限制访问, 把ip给封掉了. 如果主动限制访问频率和请求数据量是我们不想的, 毕竟爬取大量的数据还是需要效率的.
如果通过ip代理, 就可以把大量的请求分发个不同的代理ip, 减小了一个ip的访问压力, 不容易被服务器识别出来.
1 import requests 2 3 # 设置代理ip池(也可同时设置一个UA池) 4 proxies ={ 5 "http":"http://10.10.1.10:4526", 6 "https":"http://10.10.1.10:3732", 7 } 8 9 # proxies参数就是ip代理, 每次请求会从ip池选取代理ip请求 10 requests.get("https://www.taobao.com", proxies=proxies)
浙公网安备 33010602011771号