你还不会Python网络爬虫中的requests模块使用?《二》
Posted 日常分享Python
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你还不会Python网络爬虫中的requests模块使用?《二》相关的知识,希望对你有一定的参考价值。
目录
3.6 超时参数timeout的使用
在平时网上冲浪的过程中,我们经常会遇到网络波动,这个时候,一个请求等了很久可能任然没有结果。
在爬虫中,一个请求很久没有结果,就会让整个项目的效率变得非常低,这个时候我们就需要对请求进行强制要求,让他必须在特定的时间内返回结果,否则就报错。
-
超时参数timeout的使用方法
response = requests.get(url, timeout=3)
-
timeout=3表示:发送请求后,3秒钟内返回响应,否则就抛出异常
import requests
url = 'https://twitter.com'
response = requests.get(url, timeout=3) # 设置超时时间
知识点:掌握 超时参数timeout的使用
3.7 了解代理以及proxy代理参数的使用
proxy代理参数通过指定代理ip,让代理ip对应的正向代理服务器转发我们发送的请求,那么我们首先来了解一下代理ip以及代理服务器
3.7.1 理解使用代理的过程
-
代理ip是一个ip,指向的是一个代理服务器
-
代理服务器能够帮我们向目标服务器转发请求
3.7.2 正向代理和反向代理的区别
前边提到proxy参数指定的代理ip指向的是正向的代理服务器,那么相应的就有反向服务器;现在来了解一下正向代理服务器和反向代理服务器的区别
-
从发送请求的一方的角度,来区分正向或反向代理
-
为浏览器或客户端(发送请求的一方)转发请求的,叫做正向代理
-
浏览器知道最终处理请求的服务器的真实ip地址,例如VPN
-
-
不为浏览器或客户端(发送请求的一方)转发请求、而是为最终处理请求的服务器转发请求的,叫做反向代理
-
浏览器不知道服务器的真实地址,例如nginx
-
3.7.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代理)等:
-
socks 代理只是简单地传递数据包,不关心是何种应用协议(FTP、HTTP和HTTPS等)。
-
socks 代理比http、https代理耗时少。
-
socks 代理可以转发http和https的请求
-
-
3.7.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
知识点:掌握 代理ip参数proxies的使用
3.8 使用verify参数忽略CA证书
在使用浏览器上网的时候,有时能够看到下面的提示(2018年10月之前的12306网站):
-
原因:该网站的CA证书没有经过【受信任的根证书颁发机构】的认证
-
关于CA证书以及受信任的根证书颁发机构点击了解更多,课上我们不做展开
3.8.1 运行代码查看代码中向不安全的链接发起请求的效果
运行下面的代码将会抛出包含
ssl.CertificateError ...
字样的异常
import requests
url = "https://sam.huat.edu.cn:8443/selfservice/"
response = requests.get(url)
3.8.2 解决方案
为了在代码中能够正常的请求,我们使用
verify=False
参数,此时requests模块发送请求将不做CA证书的验证:verify参数能够忽略CA证书的认证
import requests
url = "https://sam.huat.edu.cn:8443/selfservice/"
response = requests.get(url,verify=False)
知识点:掌握 使用verify参数忽略CA证书
4. requests模块发送post请求
思考:哪些地方我们会用到POST请求?
登录注册( 在web工程师看来POST 比 GET 更安全,url地址中不会暴露用户的账号密码等信息)
需要传输大文本内容的时候( POST 请求对数据长度没有要求)
所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求
4.1 requests发送post请求的方法
-
response = requests.post(url, data)
-
data
参数接收一个字典 -
requests模块发送post请求函数的其它参数和发送get请求的参数完全一致
4.2 POST请求练习
下面面我们通过金山翻译的例子看看post请求如何使用:
思路分析
-
抓包确定请求的url地址
2.确定请求的参数
3.确定返回数据的位置
-
模拟浏览器获取数据
4.2.3 抓包分析的结论
-
url地址:
http://fy.iciba.com/
-
请求方法:POST
-
请求所需参数:
data = { 'f': 'auto', # 表示被翻译的语言是自动识别 't': 'auto', # 表示翻译后的语言是自动识别 'w': '人生苦短' # 要翻译的中文字符串 }
-
pc端User-Agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/71.0.3578.98 Safari/537.36
4.2.4 代码实现
了解requests模块发送post请求的方法,以及分析过移动端的百度翻译之后,我们来完成代码
import requests
import json
class King(object):
def __init__(self, word):
self.url = "http://fy.iciba.com/ajax.php?a=fy"
self.word = word
self.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
self.post_data = {
"f": "auto",
"t": "auto",
"w": self.word
}
def get_data(self):
response = requests.post(self.url, headers=self.headers, data=self.post_data)
# 默认返回bytes类型,除非确定外部调用使用str才进行解码操作
return response.content
def parse_data(self, data):
# 将json数据转换成python字典
dict_data = json.loads(data)
# 从字典中抽取翻译结果
try:
print(dict_data['content']['out'])
except:
print(dict_data['content']['word_mean'][0])
def run(self):
# url
# headers
# post——data
# 发送请求
data = self.get_data()
# 解析
self.parse_data(data)
if __name__ == '__main__':
# king = King("人生苦短,及时行乐")
king = King("China")
king.run()
# python标准库有很多有用的方法,每天看一个标准库的使用
知识点:掌握 requests模块发送post请求
5. 利用requests.session进行状态保持
requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。接下来我们就来学习它
5.1 requests.session的作用以及应用场景
-
requests.session的作用
-
自动处理cookie,即 下一次请求会带上前一次的cookie
-
-
requests.session的应用场景
-
自动处理连续的多次请求过程中产生的cookie
-
5.2 requests.session使用方法
session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie
session = requests.session() # 实例化session对象
response = session.get(url, headers, ...)
response = session.post(url, data, ...)
-
session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致
5.3 课堂测试
使用requests.session来完成github登陆,并获取需要登陆后才能访问的页面
5.3.1 提示
-
对github登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包
-
确定登陆请求的url地址、请求方法和所需的请求参数
-
部分请求参数在别的url对应的响应内容中,可以使用re模块获取
-
-
确定登陆后才能访问的页面的的url地址和请求方法
-
利用requests.session完成代码
5.3.2 参考代码
import requests
import re
# 构造请求头字典
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
}
# 实例化session对象
session = requests.session()
# 访问登陆页获取登陆请求所需参数
response = session.get('https://github.com/login', headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />', response.text).group(1) # 使用正则获取登陆请求所需参数
# 构造登陆请求参数字典
data = {
'commit': 'Sign in', # 固定值
'utf8': '✓', # 固定值
'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
'login': input('输入github账号:'),
'password': input('输入github账号:')
}
# 发送登陆请求(无需关注本次请求的响应)
session.post('https://github.com/session', headers=headers, data=data)
# 打印需要登陆后才能访问的页面
response = session.get('https://github.com/1596930226', headers=headers)
print(response.text)
知识点:掌握 利用requests.session进行状态保持
总结
下面是我整理的一些学习资料,面试题答案以及游戏源码,给需要的小伙伴【+q裙881744585】获取,希望大家的努力都不负所望,收入越来越多。 学习交流的地方,广告勿加【否则你做什么就亏什么,永远赚不到钱】
以上是关于你还不会Python网络爬虫中的requests模块使用?《二》的主要内容,如果未能解决你的问题,请参考以下文章
你还不会Python网络爬虫中的requests模块使用《一》
两万字博文教你python爬虫requests库,看完还不会我把我女朋友都给你❤️熬夜整理&建议收藏❤️