两万字博文教你python爬虫requests库【详解篇】_两万字博文教你python爬虫requests库详解篇

2.发起请求

根据入坑文可知爬虫:模拟浏览器发送请求,获取响应。那么首先我们就要学会使用Requests发起请求!

Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,直接使用Requests构造的方法,并在其中传入需要的参数即可。

源码:
def request(method, url,params=None, data=None, headers=None, cookies=None,
    timeout=None, allow_redirects=True, proxies=None,verify=None,  json=None):

参数详解:

(1)请求方法method:

每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法
在这里插入图片描述
而POST请求就可以使用post()方法,并且将需要提交的数据传递给data参数即可:
在这里插入图片描述
而其他的请求类型,都有各自对应的方法:
在这里插入图片描述

知识点补给站——POST请求方法的小知识点:
	应用场景:登录注册
	需要传输大文本内容的时候使用(post请求对长度没有要求)。

在这里插入图片描述

(2)统一资源定位符url

URL(Universal Resource Locator),即统一资源定位符。
在这里插入图片描述

(3)传递url参数params

传递URL参数也不用再像urllib中那样需要去拼接URL,而是简单的,构造一个字典,并在请求时将其传递给params参数:

import requests
params = {'key': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)
print(resp.url)

在这里插入图片描述

小知识点:
  有时候我们会遇到相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用列表表示:

import requests
params = {'key': 'value1', 'key2': ['value2', 'value3']}
resp = requests.get("http://httpbin.org/get", params=params)
print(resp.url)

在这里插入图片描述

知识点补给站:
	本文大多使用的URL站点是httpbin.org,它可以提供HTPP请求测试哦!

(4)传递form表单数据——data

将放进data的数据转换为form表单数据,同时不能传json数据,json数据为null。(注意:json和data二者只能同时存在其一)
在这里插入图片描述

注意data参数不仅可以传上图字典格式,还可以传递F12里view source,如:
stu=丸子&worker=鲸落

在这里插入图片描述
小拓展:

  • 如果传递了data参数,默认headers的Content-Type值为:application/x-www-form-urlencoded
(5)传递json数据——json

将json对应的数据放进json参数里。

在这里插入图片描述在这里插入图片描述
拓展:

  • json格式的数据也可以用data传递,只需做两步:
    (1)json.dumps一下json的值再传给data;
    (2)headers里Content-Type值给:application/json;charset=utf-8
(6)自定义headers

是不是很熟悉,这就是反爬第一阶段常用套路!

如果想自定义请求的Headers,同样的将字典数据传递给headers参数。
在这里插入图片描述

(7)自定义cookies
①获取cookies:

第一种方法:

import requests
from fake_useragent import UserAgent

r = requests.get('https://www.baidu.com',headers = {'User-Agent': UserAgent().random})
print(r.cookies)

print('\*'\*25)
print(r.cookies.items())
print('\*'\*25)

for key,value in r.cookies.items():
    print(key + "=" + value)

在这里插入图片描述

此处我们首先调用cookies属性即可成功得到cookies,可以发现他是个RequestsCookieJar类型。然后用items()方法将其转化为元组组成的列表,遍历输出每一个Cookie的名称和值,实现Cookie的遍历解析。


第二种方法:

使用requests.utils.dict_from_cookiejar把cookiejar对象转化为字典。

import requests
from fake_useragent import UserAgent

url = 'http://www.baidu.com'
response = requests.get(url=url, headers ={'user-agent': UserAgent().random})
cookie = requests.utils.dict_from_cookiejar(response.cookies)
print(cookie)

"""
输出:
{'BAIDUID\_BFESS': '52EB4182E0877DFD9DBA8E0793772027:FG=1', 'H\_PS\_PSSID': '33802\_34222\_31254\_33848\_34112\_34107\_26350\_34093', 'BDSVRTM': '0', 'BD\_HOME': '1'}
"""

在这里插入图片描述

拓展:

  • 还可以直接使用response.cookiesget_dict()方法获取字典格式的cookie。
②使用Cookie维持登录状态的两种方法:

第一种方法: 请求头中加入网页复制的cookie来维持登录状态!

实战之以QQ空间为例来说明:
(如何在网页中获取Cookie:首先登录QQ空间,将Headers中的Cookie内容复制即可!)

import requests

headers = {
    'cookie': '此处换为你自己的Cookie即可!',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
}

r = requests.get('https://user.qzone.qq.com/这里写上要登录的QQ号/infocenter', headers=headers)
print(r.text)


我们发现,结果中包含了登录后的结果,说明我们登录成功!


第二种方法: 通过cookies参数来设置,直接将cookies构造字典传入即可!

在这里插入图片描述

(8)设置代理proxies

在这里插入图片描述

  1. 什么是代理?
    代理IP是一个ip ,指的是一个代理服务器。
  2. 要晓得正向代理和反向代理是啥?
    知不知道服务器的地址做为判断标准:知道就是正向代理,不知道就是反向代理。

在这里插入图片描述
3. 代理ip的分类(常见有两大分类依据:匿名度&&协议)
  ①匿名度:
   透明代理 :目标服务器可以通过代理找到你的ip;
   匿名代理 :两者之间;
   高匿代理 :在爬虫中经常使用,目标服务器无法获取你的ip。
  ②协议:(根据网站使用的协议不同,需要使用响应的协议代理服务)
   http代理:目标的url为http协议;
   https代理:目标url为https协议;
   socks代理 :只是简单的传递数据包,不关心是何种协议,比http和HTTPS代理消耗小, 可以转发http和https的请求。

  1. 为何使用代理?
    (1)让服务器以为不是同一个客户端在请求;
    (2)防止我们的真实地址被泄露,防止被追究。

小拓展:代理详细讲解的话可以看这篇—学了那么久爬虫,快来看看这些反爬,你能攻破多少?【对应看看自己修炼到了哪个等级~】

  1. 用法:
      当我们需要使用代理时,同样构造代理字典,传递给proxies参数。

在这里插入图片描述

(9)重定向allow_redirects

在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。
在这里插入图片描述

(10)禁止证书验证vertify

有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的(比如,之前12306的整数就没有被官方CA机构信任,就会出现证书验证错误的结果!),所以证书的验证会失败,这时我们就需要关闭证书验证。

在这里插入图片描述  解决方法:在请求的时候把verify参数设置为False就可以关闭证书验证了。
在这里插入图片描述小拓展:
在这里插入图片描述  但是关闭验证后,会有一个比较烦人的warning,它建议我们给它指定证书。我们可以通过设置忽略警告的方式来屏蔽它:

在这里插入图片描述

(11)设置超时timeout

为了防止由于服务器不能及时响应而报错,而设置一个超时时间,即超过了这个时间还没有得到响应,那就报错!
  设置访问超时——设置timeout参数即可。(这个时间的计算是发出请求到服务器返回响应的时间)
  实际上:请求分为两个阶段,即连接(connect)和读取(read)。下面设置的timeout将用作连接和读取这二者的timeout总合。如果分别指定,就可以传入一个元组:timeout=(5,11,30)。
在这里插入图片描述

拓展:
实际上,我们在多数爬虫开发中——超时参数timeout是和retrying模块(刷新)一起使用的!
  1. 使用retrying模块提供的retry方法
  2. 通过装饰器的方式,让被装饰的函数反复执行
  3. retry中可以传入参数 stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行

①代码讲解:

import requests
from retrying import retry

headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 "}

@retry(stop_max_attempt_number=3)   # stop\_max\_attempt\_number=3最大执行3次,还不成功就报错
def \_parse\_url(url):                                            # 前面加\_代表此函数,其他地方不可调用
    print("\*"\*100)
    response = requests.get(url, headers=headers, timeout=3)    # timeout=3超时参数,3s内
    assert response.status_code == 200                          # assert断言,此处断言状态码是200,不是则报错
    return response.content.decode()


def parse\_url(url):
    try:
        html_str = _parse_url(url)
    except Exception as e:
        print(e)
        html_str = None
    return html_str

if __name__ == '\_\_main\_\_':
    # url = "www.baidu.com" # 这样是会报错的!
    url = "http://www.baidu.com"
    print(parse_url(url))

②实现效果一:无法爬取到的情况:url = “www.baidu.com”!
在这里插入图片描述

②实现效果二:正确爬取到的情况:url = “http://www.baidu.com”!

在这里插入图片描述

(12)文件上传

假如有的网站需要上传文件,我们也可以使用requests实现!

当前脚本的同一目录下有个名为1.jpg的文件:

import requests

files = {'file': open('1.jpg','rb')}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)

在这里插入图片描述
在这里插入图片描述
  这个网站会返回响应,里面包含files这个字段,而form字段是空的,这证明文件上传部分会单独有个files字段来标识。

(13)Prepared Request

我们知道在urllib中可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示。这在requests中同样可以做到,这个数据结构叫做Prepared Request。如下:

from requests import Request,Session

url = 'http://httpbin.org/post'
data = {
    'name':'peter'
}
headers = {
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13'
}

s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)

先用url,data,headers参数构造了一个Request对象,这时需要再调用Session的prepare_request()方法将其转换为一个Prepared Request对象,然后调用send()方法发送即可!

在这里插入图片描述
  使用较少,但是这样使用的好处是:有了Request这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便!

总结:

import requests

# res=requests.get("http://httpbin.org/get") #功能:发起完整的网络请求

'''
源码:
def request(method, url,params=None, data=None, headers=None, cookies=None,
 timeout=None, allow\_redirects=True, proxies=None,verify=None, json=None):
'''

#1.method
# res=requests.post("http://httpbin.org")
# res=requests.delete("http://httpbin.org")

# url 字符串 统一资源定位符

# params 将放进params里的字典数据变为url的请求参数(如果是中文会自动编码)
# test\_url="http://httpbin.org/get"
# params={"name":"allen","name2":"哈哈"}
# res=requests.get(url=test\_url,params=params)
# print(res.text)

# data 将放进data的数据转换为form表单数据,同时不能传json数据,json数据为null
# test\_url="http://httpbin.org/post" #post提交数据
# data={"stu":"丸子","worker":"鲸落"}
# res=requests.post(url=test\_url,data=data)
# print(res.text)

# json 将json对应的数据放进json数据里
# test\_url="http://httpbin.org/post" #post提交数据
# json={"name":"selffly"} #'{"name":"selffly"}' json串形式也可以传,字典也可以传
# res=requests.post(url=test\_url,json=json)
# print(res.text)

# 添加头部信息headers 添加cookies 添加timeout 设置代理proxies=None verify=False安全验证(为False是忽略证书)
# test\_url="http://httpbin.org/get"
# headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}
# cookies={"sessionid":"dfsdaaagdgagdf"}
# proxies={'http':"127.0.0.1:8888"} #这个代理胡写的,不可用
# res=requests.get(url=test\_url,headers=headers,cookies=cookies,timeout=10,proxies=proxies)
# print(res.text)

# 测试重定向allow\_redirects 如果为True就可以进行重定向;反之不可以
# res\_bd=requests.get("http://www.baidu.com",allow\_redirects=False)
# print(res\_bd.text)

3.接收响应

根据入坑文可知爬虫:模拟浏览器发送请求,获取响应。使用requests发送请求我们OK了,下面我们要做的就是获取响应!

通过Requests发起请求获取到的,是一个requests.models.Response对象。通过这个对象我们可以很方便的获取响应的内容。

(1)响应内容

requests通过text属性,可以获得字符串格式的响应内容。

在这里插入图片描述

(2)字符编码

Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。
在这里插入图片描述

(3)二进制数据

而如果你需要获得原始的二进制数据,那么使用content属性即可。

在这里插入图片描述

可以发现输出前带有一个b,这代表是bytes类型的数据。

(4)json数据

如果我们访问之后获得的数据是JSON格式的,那么我们可以使用json()方法,直接获取转换成字典格式的数据。
但是需要注意的是,如果返回的结果不是JSON格式,便会出现解析错误,抛出异常!

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 25
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值