Python爬虫requests库教程(四)

5.Requests进阶(2)代理的使用

对于某些网站,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模爬取,对于 大规模且频繁的请求,网站可能会弹出验证码,或者跳转到登录认证页面,更甚者可能会直接封禁客户端的 IP ,导致一定时间段内无法访问。

那么,为了防止这种情况发生,我们需要设置代理来解决这个问题,这就需要用到 proxies 参数。可以用这样的方式设置:

proxy代理参数通过指定代理ip ,让代理ip对应的正向代理服务器转发我们发送的请求,那么我们首先来了解一下代理ip以及代理服务器。微信搜索公众号:架构师指南,回复:架构师 领取资料 。

5.1 使用代理的过程

1.代理 ip 是一个 ip ,指向的是一个代理服务器

2.代理服务器能够帮我们向目标服务器转发请求

5.2 正向代理和反向代理

前边提到 proxy 参数指定的代理 ip 指向的是正向的代理服务器,那么相应的就有反向服务器;现在来了解一下正向代理服务器和反向代理服务器的区别。

❖ 从发送请求的一方的角度,来区分正向或反向代理

❖ 为浏览器或客户端(发送请求的一方)转发请求的,叫做正向代理

-浏览器知道最终处理请求的服务器的真实 ip 地址,例如 VPN

❖ 不为浏览器或客户端(发送请求的一方)转发请求、而是为最终处理请求的服务器转发请求的,叫做反向代理

-浏览器不知道服务器的真实地址,例如nginx。

5.3 代理 ip(代理服务器)的分类

❖ 根据代理 ip 的匿名程度,代理 IP 可以分为下面三类:

➢ 透明代理 (Transparent Proxy) :透明代理虽然可以直接“隐藏”你的 IP 地址,但是还是可以查到你是谁。

目标服务器接收到的请求头如下:

REMOTE_ADDR = Proxy IP

HTTP_VIA = Proxy IP

HTTP_X_FORWARDED_FOR = Your IP

➢ 匿名代理 (Anonymous Proxy) :使用匿名代理,别人只能知道你用了代理,无法知道你是谁。

目标服务器接收到的请求头如下:

REMOTE_ADDR = proxy IP

HTTP_VIA = proxy IP

HTTP_X_FORWARDED_FOR = proxy IP

➢ 高匿代理 (Elite proxy 或 High Anonymity Proxy) :高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。** 毫无疑问使用高匿代理效果最好 ** 。

目标服务器接收到的请求头如下:

REMOTE_ADDR = Proxy IP

HTTP_VIA = not determined

HTTP_X_FORWARDED_FOR = not determined

❖ 根据网站所使用的协议不同,需要使用相应协议的代理服务。

从代理服务请求使用的协议可以分为:

➢ http 代理:目标 url 为 http 协议

➢ https 代理:目标 url 为 https 协议

➢ socks 隧道代理(例如 socks5 代理)等:

✾ 1. socks 代理只是简单地传递数据包,不关心是何种应用协议( FTP 、 HTTP 和HTTPS 等)。

✾ 2. socks 代理比 http 、 https 代理耗时少。

✾ 3. socks 代理可以转发 http 和 https 的请求

5.4 proxies 代理参数的使用

为了让服务器以为不是同一个客户端在请求;为了防止频繁向一个域名发送请求被封 ip ,所以我们需要使用代理 ip ;那么我们接下来要学习 requests 模块是如何使用代理 ip 的基本用法。

response = requests . get ( url , proxies = proxies )
proxies 的形式:字典
proxies = {
" http ": " http :// 12.34.56.79: 9527 ",
" https ": " https :// 12.34.56.79: 9527 ",
}

注意:如果 proxies 字典中包含有多个键值对,发送请求时将按照 url 地址的协议来选择使用相应的代理ip

import requests
proxies = {
"http": "http://124.236.111.11:80",
"https": "https:183.220.145.3:8080"}
req = requests.get(’http://www.baidu.com’,proxies =proxies)
req.status_code
  

6.Requests进阶(3)—SSL证书验证

此外, requests还提供了证书验证的功能。当发送HTTP请求的时候,它会检查SSL证书,我 们可以使用verify参数控制是否检查此证书。其实如果不加verify参数的话,默认是True,会向动验证。

现在我们用 requests 来测试一下:

import requests
url = 'https://cas.xijing.edu.cn/xjtyrz/login'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers)

  

SSLError: HTTPSConnectionPool(host= ’cas.xijing.edu.cn’ , port=443): Max retries exceeded with url: /xjtyrz/login (Caused by SSLError(SSLCertVerificationError(1,[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)’)))

这里提示一个错误 SSL Error ,表示证书验证错误。所以,如果请求一个 HTTPS 站点,但是证书验证错误的页面时,就会报这样的错误,那么如何避免这个错误呢?很简单,把 verify 参数设置为 False 即可。

相关代码如下:

import requests
url = 'https://www.jci.edu.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers,verify=False)
req.status_code 

200

找不到需要做 SSL 验证的网页了,好气哦 !

不过我们发现报了一个警告它建议我们给它指定证书。我们可以通过设置忽略警告的方式来屏蔽这个警告:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
url = 'https://www.jci.edu.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers,verify=False)
req.status_code

200

或者通过捕获警告到日志的方式忽略警告:

import logging
import requests
logging.captureWarnings(True)
url = 'https://www.jci.edu.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers,verify=False)
req.status_code

200

当然,我们也可以指定一个本地证书用作客户端证书,这可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组:

import requests
response = requests.get(https://www.12306.cn’,cert=(./path/server.crt’,/path/key
))
print(response.status_code)

200

当然,上面的代码是演示实例,我们需要有 crt 和 ke y 文件,并且指定它们的路径。注意,本地私有证书的 key 必须是解密状态,加密状态的 key 是不支持的。现在都很少有这种了网址了 !

7.Requests库其他内容


7.1 查看响应内容

发送请求后,得到的自然就是响应。在上面的实例中,我们使用 text 和 content 获取了响应的内容。此外,还有很多属性和方法可以用来获取其他信息,比如状态码、响应头、Cookies 等。

示例如下:

import requests
url = 'https://www.baidu.com'
req = requests.get(url)
print(req.status_code)
# 响应状态码
print(req.text)
# 响应的文本内容
print(req.content)
# 响应的二进制内容
print(req.cookies)
# 响应的cookies
print(req.encoding)
# 响应的编码
print(req.headers)
# 响应的头部信息
print(req.url)
# 响应的网址
print(req.history)
# 响应的历史

7.2 查看状态码与编码

使用 rqg.status_code 的形式可查看服务器返回的状态码,而使用 rqg.encoding 的形式可通过 服务器返回的 HTTP 头部信息进行网页编码。需要注意的是,当 Requests 库猜测错误的时候,需 要手动指定 encoding 编码,避免返回的网页内容出现乱码。

7.3 发送get请求,并手动指定编码

代码 1-2: 发送 get 请求,并手动指定编码

url = 'http://www.tipdm.com/tipdm/index.html'
rqg = requests.get(url)
print('状态码 ',rqg.status_code)
print('编码 ',rqg.encoding)
rqg.encoding = 'utf-8' #手动指定编码
print('修改后的编码 ',rqg.encoding)
# print(rqg.text)

状态码,200

编码,ISO-8859-1

修改后的编码,utf-8

笔记

手动指定的方法并不灵活,无法自适应爬取过程中的不同的网页编码,而使用chardet库的方法比较简便灵活。chardet 库是一个非常优秀的字符串 / 文件编码检测模块

7.4 chardet 库的使用

chartdet 库的 detect 方法可以检测给定字符串的编码,其语法格式如下。

chartdet.detect(byte_str)

detect 方法常用参数及其说明

byte_str :接收 string 。表示需要检测编码的字符串。无默认值

7.5 使用detect方法检测编码并指定

代码 1-3: 使用 detect 方法检测编码并指定编码

import chardet
url = 'http://www.tipdm.com/tipdm/index.html'
rqg = requests.get(url)
print(rqg.encoding)
print(chardet.detect(rqg.content))
rqg.encoding = chardet.detect(rqg.content)['encoding']
# 访问字典元素
print(rqg.encoding)

ISO-8859-1

{ ’encoding’ : ’utf-8’ , ’confidence’ : 0.99, ’language’ : ’’ }

utf-8

7.6 requests 库综合测试

向网站 ’http://www.tipdm.com/tipdm/index.html’ 发送一个完整GET的请求 , 该请求包含链接、 请求头、响应头、超时时间和状态码, 并且编码正确设置。

代码 1-6: 生成完整的HTTP请求。

# 导入相关的库
import requests
import chardet
# 设置url
url = 'http://www.tipdm.com/tipdm/index.html'
# 设置请求头
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"}
# 生成GET请求,并设置延时为2
rqg = requests.get(url,headers=headers,timeout = 2)
# 查看状态码
print("状态码 ",rqg.status_code)
# 检测编码(查看编码)
print('编码 ',rqg.encoding)
# 使用chardet库的detect方法修正编码
rqg.encoding = chardet.detect(rqg.content)['encoding']
# 检测修正后的编码
print('修正后的编码: ',rqg.encoding)
#查看响应头
print('响应头:',rqg.headers)
# 查看网页内容
#print(rqg.text)
状态码,200

  

编码,ISO-8859-1

修正后的编码 : utf-8

响应头:{ ’Date’ : ’Mon, 18 Nov 2019 06:28:56 GMT’ , ’Server’ : ’Apache-Coyote/1.1’ , ’

Accept-Ranges’ : ’bytes’ , ’ETag’ : ’W/“15693-1562553126764”’ , ’Last-Modified’ : ’

Mon, 08 Jul 2019 02:32:06 GMT’ , ’Content-Type’ : ’text/html’ , ’Content-Length’ : ’

15693’ , ’Keep-Alive’ : ’timeout=5, max=100’ , ’Connection’ : ’Keep-Alive’ }

我准备了一些非常系统的Python资料,除了为你提供一条清晰、无痛的学习路径,还甄选了最实用的学习资源以及庞大的主流爬虫案例库。短时间的学习,你就能够很好地掌握爬虫这个技能,获取你想得到的数据,需要的朋友可以扫描文末二维码即可获取

01 专为0基础设置,小白也能轻松学会

我们把Python的所有知识点,都穿插在了漫画里面。

在Python小课中,你可以通过漫画的方式学到知识点,难懂的专业知识瞬间变得有趣易懂。
在这里插入图片描述

在这里插入图片描述

你就像漫画的主人公一样,穿越在剧情中,通关过坎,不知不觉完成知识的学习。

02 无需自己下载安装包,提供详细安装教程

在这里插入图片描述

03 规划详细学习路线,提供学习视频

在这里插入图片描述

在这里插入图片描述

04 提供实战资料,更好巩固知识

在这里插入图片描述

05 提供面试资料以及副业资料,便于更好就业

在这里插入图片描述
在这里插入图片描述

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要也可以扫描下方csdn官方二维码或者点击主页和文章下方的微信卡片获取领取方式,【保证100%免费】
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值