1.request是什么
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。 ——requests中文文档
这个解释也是够调皮的,可以理解为一个发起网络请求的python库
2.requests安装
pip3 install requests
3.httpbin:测试 HTTP 请求及响应的网站
http://httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。它用 Python + Flask 编写,是github上的一个开源项目。
当访问网址并声明请求方式时:http://httpbin.org/get 返回值如下
{"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对象基本属性
import requests
r=requests.get('https://www.baidu.com/')
print(r.status_code) #状态码
print(r.text) #网站内容
print(r.cookies) #本地cookies信息
get方法
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作为测试网站,返回如下结果
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"}
通过'params='参数传递了之前构造好的jason数据,
伪造请求头
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
而看上面的结果,"User-Agent":"python-requests/2.9.1",这等于告诉对方服务器,我是一个python程序发起的requests请求,等于告诉了对方服务器你是一个爬虫,由于爬虫会消耗一定的服务器资源,所以需要伪造一个请求头,否则有的网站会拒绝爬虫的访问
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信息
返回结果
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"}
这样让对方误以为这是一个正常的请求,这个请求头不是编写的,是我从chrome浏览器,开发者工具那里复制过来的,url被自动构造成了传统的?传参了
post请求
post请求是向服务器发送一些数据,当然get也能就像上面的程序一样,但get仅限于发送少量信息,并且get传递的参数是通过URL传参的
这个程序是我之前为别人投票发现,没有登录验证,做的一个通过post表单提交的方式,刷票
#-- coding:utf-8 --
import requests
formdata = {"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来获取
- python IO操作复习
由于文件读写时都有可能文件不存在产生IOError,导致后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,使用try ... finally来实现:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
但是每次都这样写太繁琐,所以,Python引入了with语句来自动调用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
二进制文件通过wb模式来写入文件;通过rb模式来读出二进制文件
爬取一张美女图片@^@
import requests
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'}
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)
如果不伪造请求头的话,爬取下来的图片是打不开的,也就是说服务器并没有返回图片给我
运行效果,看波妹子