requests模块
Posted glh-ty
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了requests模块相关的知识,希望对你有一定的参考价值。
一,介绍
requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
为什么要使用requests模块
- 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
- 手动处理url编码
- 手动处理post请求参数
- 处理cookie和代理操作繁琐
- 使用requests模块:
- 自动处理url编码
- 自动处理post请求参数
- 简化cookie和代理操作
二,使用
pip install requests
使用流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
三,GET请求
import requests url = "https://www.sogou.com/web?" word = input("请输入关键词:").stript() #自定义请求头信息 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/70.0.3538.67 Safari/537.36" } #封装get请求参数 params = { "query": word } #发起请求 response = requests.get(url=url, headers=headers, params=params) #获取响应数据 res_text = response.text
with open("jiqiren.html", "w", encoding="utf-8") as f: f.write(res_text) print("over")
请求头相关:
#通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下 Host Referer #大型网站通常都会根据该参数判断请求的来源 User-Agent #客户端 Cookie #Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他,headers={}内就不要放它了
四,POST请求
需求:登录豆瓣电影,爬取登录成功后的页面数据
首先,使用抓包工具fiddler或者浏览器自带的network,获取登陆的url,以及需要的参数
import requests url = "https://www.douban.com/accounts/login" #封装请求参数 data = { "source": "index_nav", "form_email": "[email protected]", "form_password": "goulonghui371379." } response = requests.post(url=url, data=data, proxies={"https":"39.137.2.226:8080"})
res_text = response.text
with open("douban.html", "w", encoding="utf-8") as f: # 代理IP proxies={"https":"39.137.2.226:8080"}
f.write(res_text)
五,ajax发送的GET请求
豆瓣电影,电影分类中,鼠标滚轮滚时,发送的ajax请求获取数据
import requests url = "https://movie.douban.com/j/chart/top_list?" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36" } params = { "type": "24", "interval_id": "100:90", "action": "", "start": "20", "limit": "20" } response = requests.get(url=url, headers=headers, params=params, proxies={"https":"39.137.2.246:8080"}) res_text = response.text res_text
六,ajax发送的POST请求
需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
import requests url = ‘http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword‘ #定制请求头信息,相关的头信息必须封装在字典结构中 headers = { #定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数 ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36‘, } #定制post请求携带的参数(从抓包工具中获取) data = { ‘cname‘:‘‘, ‘pid‘:‘‘, ‘keyword‘:‘北京‘, ‘pageIndex‘: ‘1‘, ‘pageSize‘: ‘10‘ } #发起post请求,获取响应对象 response = requests.get(url=url,headers=headers,data=data) #获取响应内容:响应内容为json串 print(response.text)
七,其他高级用法
#编码问题 import requests response=requests.get(‘http://www.autohome.com/news‘) # response.encoding=‘gbk‘ #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码 print(response.text)
1、SSL Cert Verification
#证书验证(大部分网站都是https) import requests respone=requests.get(‘https://www.12306.cn‘) #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端 #改进1:去掉报错,但是会报警告 import requests respone=requests.get(‘https://www.12306.cn‘,verify=False) #不验证证书,报警告,返回200 print(respone.status_code) #改进2:去掉报错,并且去掉警报信息 import requests from requests.packages import urllib3 urllib3.disable_warnings() #关闭警告 respone=requests.get(‘https://www.12306.cn‘,verify=False) print(respone.status_code) #改进3:加上证书 #很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书 #知乎百度等都是可带可不带 #有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站 import requests respone=requests.get(‘https://www.12306.cn‘, cert=(‘/path/server.crt‘, ‘/path/key‘)) print(respone.status_code)
2、使用代理
#官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies #代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情) import requests proxies={ ‘http‘:‘http://egon:[email protected]:9743‘,#带用户名密码的代理,@符号前是用户名与密码 ‘http‘:‘http://localhost:9743‘, ‘https‘:‘https://localhost:9743‘, } respone=requests.get(‘https://www.12306.cn‘, proxies=proxies) print(respone.status_code) #支持socks代理,安装:pip install requests[socks] import requests proxies = { ‘http‘: ‘socks5://user:[email protected]:port‘, ‘https‘: ‘socks5://user:[email protected]:port‘ } respone=requests.get(‘https://www.12306.cn‘, proxies=proxies) print(respone.status_code)
3、超时设置
#超时设置 #两种超时:float or tuple #timeout=0.1 #代表接收数据的超时时间 #timeout=(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间 import requests respone=requests.get(‘https://www.baidu.com‘, timeout=0.0001)
4、 认证设置
#官网链接:http://docs.python-requests.org/en/master/user/authentication/ #认证设置:登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的 # 但本质原理是拼接成请求头发送 # r.headers[‘Authorization‘] = _basic_auth_str(self.username, self.password) # 一般的网站都不用默认的加密方式,都是自己写 # 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法 # 得到加密字符串后添加到请求头 # r.headers[‘Authorization‘] =func(‘.....‘) #看一看默认的加密方式吧,通常网站都不会用默认的加密设置 import requests from requests.auth import HTTPBasicAuth r=requests.get(‘xxx‘,auth=HTTPBasicAuth(‘user‘,‘password‘)) print(r.status_code) #HTTPBasicAuth可以简写为如下格式 import requests r=requests.get(‘xxx‘,auth=(‘user‘,‘password‘)) print(r.status_code)
5、异常处理
#异常处理 import requests from requests.exceptions import * #可以查看requests.exceptions获取异常类型 try: r=requests.get(‘http://www.baidu.com‘,timeout=0.00001) except ReadTimeout: print(‘===:‘) # except ConnectionError: #网络不通 # print(‘-----‘) # except Timeout: # print(‘aaaaa‘) except RequestException: print(‘Error‘)
6、上传文件
import requests files={‘file‘:open(‘a.jpg‘,‘rb‘)} respone=requests.post(‘http://httpbin.org/post‘,files=files) print(respone.status_code)
以上是关于requests模块的主要内容,如果未能解决你的问题,请参考以下文章
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段
如何使用模块化代码片段中的LeakCanary检测内存泄漏?
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段