1.request是什么 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。 ——requests中文文档
这个解释也是够调皮的,可以理解为一个发起网络请求的python库
2.requests安装
3.httpbin:测试 HTTP 请求及响应的网站 http://httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。它用 Python + Flask 编写,是github上的一个开源项目。
当访问网址并声明请求方式时:http://httpbin.org/get 返回值如下
1 2 3 4 5 6 7 8 9 10 {"args" :{}, "headers" :{ "Accept" :"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" ,"Accept-Encoding" :"gzip, deflate" ,"Accept-Language" :"zh,en-US;q=0.9,en;q=0.8" ,"Connection" :"close" ,"Cookie" :"_gauges_unique_hour=1; _gauges_unique_day=1; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1" ,"Host" :"httpbin.org" ,"Upgrade-Insecure-Requests" :"1" ,"User-Agent" :"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36" },"origin" :"112.117.10.72" ,"url" :"http://httpbin.org/get" }
包含Cookie和User-Agent信息
4.requests基本用法 requests对象基本属性 1 2 3 4 5 6 7 import requests r=requests.get('https://www.baidu.com/' ) print (r.status_code) #状态码print (r.text) #网站内容print (r.cookies) #本地cookies信息
get方法 1 2 3 4 5 6 7 8 9 10 11 import requests r = requests.get('http://httpbin.org/get?name=yhchdev&pasword=888' ) data = { 'name' :'yhchdev' ,'password' :'888' } r = requests.get("http://httpbin.org/get" ,params=data) print (r.status_code) #状态码print (r.text) #网站内容print (r.cookies) #本地cookies信息
这里使用了上面介绍的httpbin作为测试网站,返回如下结果
1 2 3 4 5 6 7 8 200 {"args" : {"name" :"yhchdev" ,"password" :"888" }, "headers" :{"Accept" :"*/*" ,"Accept-Encoding" :"gzip, deflate" ,"Connection" :"close" ,"Host" :"httpbin.org" ,"User-Agent" :"python-requests/2.9.1" },"origin" :"112.117.10.72" ,"url" :"http://httpbin.org/get?name=yhchdev&password=888" }<RequestsCookieJar[]>
通过’params=’参数传递了之前构造好的jason数据,
伪造请求头 User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
而看上面的结果,”User-Agent”:”python-requests/2.9.1”,这等于告诉对方服务器,我是一个python程序发起的requests请求,等于告诉了对方服务器你是一个爬虫,由于爬虫会消耗一定的服务器资源,所以需要伪造一个请求头,否则有的网站会拒绝爬虫的访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import requests #r=requests.get('https://www.baidu.com/' ) headers = { 'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36' } r = requests.get('http://httpbin.org/get?name=yhchdev&pasword=888' ) data = { 'name' :'yhchdev' , 'password' :'888' } r = requests.get("http://httpbin.org/get" ,params=data,headers=headers) print (r.status_code) #状态码print (r.text) #网站内容print (r.cookies) #本地cookies信息
返回结果
1 2 3 4 5 200 {"args" :{"name" :"yhchdev" ,"password" :"888" },"headers" :{"Accept" :"*/*" ,"Accept-Encoding" :"gzip, deflate" ,"Connection" :"close" ,"Host" :"httpbin.org" ,"User-Agent" :"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36" },"origin" :"112.117.10.72" , "url" :"http://httpbin.org/get?password=888&name=yhchdev" } <RequestsCookieJar[]>
这样让对方误以为这是一个正常的请求,这个请求头不是编写的,是我从chrome浏览器,开发者工具那里复制过来的,url被自动构造成了传统的?传参了
post请求 post请求是向服务器发送一些数据,当然get也能就像上面的程序一样,但get仅限于发送少量信息,并且get传递的参数是通过URL传参的
这个程序是我之前为别人投票发现,没有登录验证,做的一个通过post表单提交的方式,刷票
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import requestsformdata = {"cvs" :{"i" :200223539 ,"t" :"oh2piVp" ,"s" :200637556 ,"acc" :"dxjjW5uC7FyLWtyrSLyYGaes9Rw9ilWu" ,"r" :"" ,"c" :{"cp" :{"202381408" :[201932143 ]}}}} headers={'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' ,'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36' } URL= "http://cn.mikecrm.com/handler/web/form_runtime/handleSubmit.php" for i in range(1 ,50 ): response=requests.post(URL,data=formdata,headers=headers) print (response.url) html = response.text print (html) print ("第 %d 个post请求提交成功" %(i))
formdata是通过chrome开发者工具抓包分析得来的,提交我所勾选的选项后提交给服务器的数据,URL为投票的网址,同时也伪造了请求头,最后有没有投上去我是不知到哈哈,因为这个网站是通过cookies来判断用户有没有投票的,但是我这里是没有cookies的,因为伪造cookies在这里是没有意义的,因为一旦有了cookie便只能投一次票了
二进制文件的爬取
图片、视频、音频文件本质是二进制文件,要爬取它们获取他们的二进制就可以了,文本是通过text 获取,二进制文件通过content 来获取
由于文件读写时都有可能文件不存在产生IOError,导致后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,使用try … finally来实现:
1 2 3 4 5 6 try : f = open ('/path/to/file' , 'r' ) print (f .read ()) finally : if f : f .close ()
但是每次都这样写太繁琐,所以,Python引入了with语句来自动调用close()方法:
1 2 with open ('/path/to/file' , 'r' ) as f: print(f.read ())
这和前面的try … finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
二进制文件通过wb 模式来写入文件;通过rb 模式来读出二进制文件
爬取一张美女图片@^@
1 2 3 4 5 6 7 import requestsheaders={'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' ,'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36' } r=requests.get ('http://mm.chinasareview.com/wp-content/uploads/2017a/07/07/01.jpg' ,headers=headers) with open ('/home/yhch/pytest.jpg' ,'wb' ) as f: f.write (r.content)
如果不伪造请求头的话,爬取下来的图片是打不开的,也就是说服务器并没有返回图片给我
运行效果,看波妹子
投喂我 写文不易,如果本文对你有帮助,点击Donate,微信和支付宝投喂我