Requests 惟一的一个非转基因的 Python HTTP 库,人类能够安全享用。html
python
与urllib的区别,urllib的缺点git
手动处理url编码github
手动处理post请求参数web
处理cookie和代理操做繁琐json
requests模块有点:浏览器
自动处理url编码安全
自动处理post请求参数服务器
简化cookie和代理操做cookie
pip install requests
requests最简单实例:
import requests r = requests.get("http://www.baidu.com") r.status_code r.encoding = 'utf-8' r.text
使用基本流程:
指定url
基于requests模块发起请求
获取响应对象中的数据值
持久化存储
请求载体身份标识的假装:
User-Agent:请求载体身份标识,经过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。能够经过判断该值来获知该请求的载体到底是基于哪款浏览器仍是基于爬虫程序。
反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,若是该请求的UA为爬虫程序,则拒绝向该请求提供数据。
反反爬策略:将爬虫程序的UA假装成某一款浏览器的身份标识。
1.requests.request(method, url, **kwargs)
r = requests.request('GET', url, **kwargs) r = requests.request('HEAD', url, **kwargs) r = requests.request('POST', url, **kwargs) r = requests.request('PUT', url, **kwargs) r = requests.request('PATCH', url, **kwargs) r = requests.request('delete', url, **kwargs) r = requests.request('OPPTIONS', url, **kwargs)
**kwargs:控制访问的参数,均为可选项
eg: kv = {'key1':'value1', 'key2':value2'} r = requests.request('get', 'http://python123.io/ws', params=kv) print(r.rul) => http://python123.io/ws?key1=value1&key2=value2
eg: 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)
eg: kv = {'key1:value1'} r = requests.request('post', 'http://python123.io/ws', json=kv)
hd = {'user-agent': 'Chrome/10'} r = requests.request('POST', 'http://python123.io/ws', headers=hd)
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)
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)
2.requests.get(url, params=None, **kwargs)
3.requests.head(url, **kwargs)
4.requests.post(url, dats=None, json=None, **kwargs)
5.requests.put(url, data=None, **kwargs)
6.requests.patch(url, data=None, **kwargs)
7.requests.delete(url, **kwargs)
r = requests.get(url)
r = requests.get(url, params=None, **kwargs)
import requests response=requests.get('http:/www.baidu.com/') print(response.text)
一般咱们在发送请求时都须要带上请求头,请求头是将自身假装成浏览器的关键,常见的有用的请求头以下:
Host
Referer:大型网站一般都会根据该参数判断请求的来源
User-Agent:客户端
Cookie:Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他,headers={}内就不要放它了
url = "https://www.sogou.com/web" # 设定动态的请求参数 wd = input("enter a key word:") params = { "query":wd } # UA假装 headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" } # 参数2:params是一个字典,用来处理动态请求参数 response = requests.get(url=url,params=params,headers=headers) # 修改原始的编码格式 response.encoding = "utf-8" page_text = response.text fileName = wd + ".html" with open(fileName,"w",encoding="utf-8") as fp: fp.write(page_text) print(fileName,"下载成功!")
1.本身拼接GET参数
# 在请求头内将本身假装成浏览器,不然百度不会正常返回页面内容 import requests headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', } response=requests.get('https://www.baidu.com/s?wd=python&pn=1',headers=headers) print(response.text) # 若是查询关键词是中文或者有其余特殊符号,则不得不进行url编码 from urllib.parse import urlencode wb = "熊大" encode_res = urlencode({"k":wb},encoding="utf-8") print(encode_res) #k=haiyan%E6%B5%B7%E7%87%95 keywords = encode_res.split("=")[1] #haiyan%E6%B5%B7%E7%87%95 url = "https://www.baidu.com/s?wd=%s&pn=1"%(keywords) # url = "https://www.baidu.com/s?"+encode_res print(url) # 而后拼接成url response = requests.get( url, headers =headers )
2.url中传递params参数
url = "https://www.sogou.com/web" # 设定动态的请求参数 wd = input("enter a key word:") params = { "query":wd } # UA假装 headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" } # 参数2:params是一个字典,用来处理动态请求参数 response = requests.get(url=url,params=params,headers=headers) # 修改原始的编码格式 response.encoding = "utf-8" page_text = response.text fileName = wd + ".html" # 保存到本地文件 with open(fileName,"w",encoding="utf-8") as fp: fp.write(page_text) print(fileName,"下载成功!")
登陆github,而后从浏览器中获取cookies,之后就能够直接拿着cookie登陆了,无需输入用户名密码。
# 用户名:egonlin 邮箱378533872@qq.com 密码lhf@123 import requests Cookies={ 'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc', } response=requests.get('https://github.com/settings/emails', cookies=Cookies) #github对请求头没有什么限制,咱们无需定制user-agent,对于其余网站可能还须要定制 print('378533872@qq.com' in response.text) # True
与get请求的区别:
get请求:
没有请求体
数据必须在1K以内!
GET请求数据会暴露在浏览器的地址栏中
post请求:
数据不会出如今地址栏中
数据的大小没有上限
有请求体
请求体中若是存在中文,会使用URL编码!
import requests response=requests.get('http:/www.baidu.com/') print(response.text)
post请求的数据在form-data中,能够获取请求中的form-data数据,根据咱们的需求改动数据,发起请求。
url = "https://movie.douban.com/j/chart/top_list" num = 200 for i in range(0,num,20): start = i data = { "type": "24", "interval_id": "100:90", "action": "", "start": i, "limit": "20" } response = requests.post(url=url,data=data,headers=headers) for movie in response.json(): print(movie["rank"],movie["title"],movie["score"])
post请求登陆:
对于登陆来讲,应该输错用户名或密码而后分析抓包流程,用脑子想想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包
要作登陆的时候必定记得要把cookie先清除;
requests.session():中间的cookie都不用本身分析了,有用的没用的都给放进来了、
response.cookie.get_dict() #获取cookie
1.目标站点分析
而后输入错误的帐号密码,抓包
发现登陆行为是post提交到:https://github.com/session
并且请求头包含cookie
并且请求体包含:
commit:Sign in
utf8:✓
authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==
login:egonlin
password:123
2.流程分析:
先GET:https://github.com/login拿到初始cookie与authenticity_token
返回POST:https://github.com/session, 带上初始cookie,带上请求体(authenticity_token,用户名,密码等)
最后拿到登陆cookie
ps:若是密码时密文形式,则能够先输错帐号,输对密码,而后到浏览器中拿到加密后的密码,github的密码是明文
import requests import re #第一次请求 r1=requests.get('https://github.com/login') r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被受权) authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN #第二次请求:带着初始cookie和TOKEN发送POST请求给登陆页面,带上帐号密码 data={ 'commit':'Sign in', 'utf8':'✓', 'authenticity_token':authenticity_token, 'login':'317828332@qq.com', 'password':'alex3714' } r2=requests.post('https://github.com/session', data=data, cookies=r1_cookie ) login_cookie=r2.cookies.get_dict() #第三次请求:之后的登陆,拿着login_cookie就能够,好比访问一些我的配置 r3=requests.get('https://github.com/settings/emails',cookies=login_cookie) print('317828332@qq.com' in r3.text) #True
import requests respone=requests.get('http://www.jianshu.com')
response属性:
text:字符串的文本内容
content:二进制byte格式的内容
status_code:响应的状态码
cookies:请求的cookie数据
encoding:响应体的编码格式
cookies.get_dict():请求cookies的字典
url:请求的的url
json():请求数据为json时,返回json字典