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)
View 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)
View 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)
View Code

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)
View 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)
View Code

6、上传文件

技术分享图片
import requests
files={file:open(a.jpg,rb)}
respone=requests.post(http://httpbin.org/post,files=files)
print(respone.status_code)
View 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)(代码片段

如何有条件地将 C 代码片段编译到我的 Perl 模块?

推进学说代码片段