半个小时学会requests
- requests是python的网络请求库,有非常强大的功能。而且比urllib更加简单、好用
requests 的安装非常方便:直接pip直接安装
pip install requests
requests 的基本用法
实现get请求
import requests r = requests.get('https://www.baidu.com') print(type(r)) print(r.status_code) # 重点 ,查看状态吗 print(r.text) print(r.cookies)
如果要在url附加额外的信息
data = { 'name':'germey', 'age':'22' } r = requests.get('http://httpbin.org/get',params = data) print(r.url) # 这样参数就非常简单的添加到url里面去了,用过 urllib的同学应该知道,在urllib里添加信息又要转字节流。 print(r.text) ########################## 运行结果: http://httpbin.org/get?name=germey&age=22 { "args": { "age": "22", "name": "germey" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "origin": "121.17.176.240", "url": "http://httpbin.org/get?name=germey&age=22" }
我们观察上面的返回结果,发现结果是json格式的。但是它实际上的类型是 str类型。有么有一种方法直接返回字典格式的结果。
print(type(r.text)) print(r.json()) print(type(r.json())) a = r.json() print(a['args']) # 这样就可以很方便的提取网页中的 json 数据了。 但是要注意的是,如果返回结果不是json格式,就会出现解析错误。 ******************************* 运行结果: <class 'str'> {'args': {'age': '22', 'name': 'germey'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '121.17.176.240', 'url': 'http://httpbin.org/get?name=germey&age=22'} <class 'dict'>
在服务端一般都会读取网页的 headers请求头,如果发现请求头为一些网络爬虫的请求头,就或拒绝访问,如下:
import requests r = requests.get('https://www.zhihu.com/explore') print(r.text) ''' 看下面结果,就会发现给出了请求错误的提示信息 ''' *************************** <html> <head><title>400 Bad Request</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <hr><center>openresty</center> </body> </html>
- 修改请求头:
chrome 的请求头
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
火狐浏览器的请求头
User-Agent:Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0 ************************* headers = { 'User-Agent':'Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0' } r = requests.get('https://www.zhihu.com/explore',headers=headers) print(r.status_code) print(r.text) # 这样我们就可以非常轻松的得到知乎的结果了。
抓取网络上的图片
import requests r = requests.get('https://www.autocar.co.uk/sites/autocar.co.uk/files/styles/gallery_slide/public/images/car-reviews/first-drives/legacy/911t-0357.jpg?itok=VJsdq9hv',timeout=2) with open('911.png','wb') as f: f.write(r.content) # 这张爱车的图片就出现在你的文件夹里了。
使用post请求
import requests data = {'name':'yang','age':'22'} r =requests.post('http://httpbin.org/post',data=data) print(r.text) print(r.url) # 我们查看结果得到,我们post的结果已经显示到了网页当中。但是url并没有发生任何变化,其实是post是将数据写在了请求体中发送过去的。 ******************************** { "args": {}, "data": "", "files": {}, "form": { "age": "22", "name": "yang" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "16", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "121.17.176.240", "url": "http://httpbin.org/post" } http://httpbin.org/post
响应:发送过去结果之后,必定会得到响应。此外,还有很多别的方法来获取其他的信息,如状态码、响应头、Cookies等
import requests r= requests.get('https://www.baidu.com') print(r.status_code) # 返回状态码 print(r.headers) #返回headers头 print(r.cookies) # 返回Cookies print(r.url) # 返回url print(r.history) # 返回请求历史
requests 的一些高级用法:
- 文件上传
一下网站需要提交一些数据。假如有的网站需要上传文件,我们如何实现呢。
import requests files = {'files':open('911.png','rb')} r = requests.post('http://httpbin.org/post',files=files) print(r.text) # 这样我们就上传完成了文件
cookies:
获取cookies
import requests headers = { 'User-Agent':'Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0' } r = requests.get('https://www.baidu.com',headers=headers) for key,value in r.cookies.items(): print(key +'='+value)
使用cookie
import requests headers = { 'cookie': '_zap=aeac411e-6a5e-4dc6-abe3-ce7592902e65; _xsrf=LCk21sqrw5m5bghUuS4FgQkdNSKpSbZD; q_c1=de06444849884f7ba87c58d7178d3a3d|1535102667000|1535102667000; d_c0="ANCmU57jGg6PTpudGgCWcy8QRJFntSWIzEI=|1535102667"; tgw_l7_route=ec452307db92a7f0fdb158e41da8e5d8; capsion_ticket="2|1:0|10:1535617477|14:capsion_ticket|44:NGM2Y2VkOWUwMmExNGRiYmI4N2Y0NmYzZGY4MmJiNzE=|2d886e52a8c2987be5e9169b913e81f7010f4d32f4c8038fd4746e7b2a43b5b7"; z_c0="2|1:0|10:1535617486|4:z_c0|92:Mi4xYmZUVkF3QUFBQUFBMEtaVG51TWFEaVlBQUFCZ0FsVk56dmQwWEFCaFE2SzVRdnN2OHpNQTQtVzc5Z3NfWG1rTnJB|204923349accbf41e153d07746aab92b75ceab7f4b3b391bed36b2cb2d9f06fa"', 'Host' :'www.zhihu.com', 'User-Agent':"'User-Agent':'Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0'" } r = requests.get('https://www.zhihu.com',headers=headers) print(r.status_code) print(r.text) # 查看结果,就可以看到登录成功。
回话维持,当你利用了 get或者 post等方法请求网页的时候,实力上是打开了不同的回话,相当于
你打开了不同的浏览器,我们登录之后,想获取网页信息,有不想获取Cookie,这时候就用到了回话维持。import requests s= requests.Session() s.get('http://httpbin.org/cookies/set/number/789456123') r = s.get('http://httpbin.org/cookies') print(r.text)
- 代理设置:
在大规模爬去网页中,会封禁ip或者调到登录验证。为了防止这个情况,我们可以就需要设置代
import requests proxies = { 'http':'http://192.168.0.1:5555', 'https':'http://192.168.0.1:1085', } requests.get('https://www.taobao.com',proxies=proxies)