小猪的Python学习之旅 —— 10.三分钟上手Requests库

小猪的Python学习之旅 —— 10.三分钟上手Requests库

标签:Python


一句话概括本文

本节讲解Requests库的常见使用,以及一个实战项目:
扒取某一篇微信文章里所有的图片,视频,音频
尤其在扒取视频和音频的时候思考非常好玩~

配图:给凉了的大A站上香:


引言

刚学爬虫没多久的时候就知道requests这个HTTP库了,不过
因为自己觉得学习新的库需要一定的时间成本,而且自带的
urllib写写小爬虫够用,就没去深入学,在写上一节的
时候评论有人就提到了requests,除了那个Referer的坑
外,在使用urllib的时候就遇到一些很繁琐的东西了,
举几个例子:

  • 发送Get和Post请求
  • Cookie处理
  • 设置代理

还有一点urllib默认不支持压缩,要返回压缩格式,必须在
请求头里写明 accept-encoding,然后获取返回数据时要在
响应头里是否有accept-encoding以此判断是否需要解码,
非常繁琐

当然你可以自己对urllib进行一些常用的封装,以此规避此类
问题。恰逢前几天,看到我妹蹲在电脑前在呆呆地重复做些
什么事情,好奇的问了下她:

我妹

保存微信文章里的图片,音频,视频啊,写公司的文章要用到。

:这么呆???

是的,她就这样重复每一篇文章:

右键图片保存,视频打开chrome f12找到flash里的视频链接,
然后再发到http://v.ranks.xin/解析,得到下载的url,再进行下载
 
作为技术宅的欧尼酱,肯定要写个小脚本来帮她脱离这种
重复性的劳动,作为交换条件,她需要打扫一周卫生。

所以就有了这个实战例子~
(PS:某宝上有这样的工具,竟然卖10块钱,还有人买,2333)


1.Requests简介

(本节只讲述常用的姿势,更多内容可到官方文档中翻阅~)

作者:Kenneth Reitz
Gayhub地址https://github.com/kennethreitz
官方仓库https://github.com/requests/requests/
官方文档http://www.python-requests.org/en/master/

Feature Support

  • International Domains and URLs —— 国际化域名和URL
  • Keep-Alive & Connection Pooling —— Keep-Alive & 连接池
  • Sessions with Cookie Persistence —— 带持久Cookie的会话
  • Browser-style SSL Verification —— 浏览器式的SSL认证
  • Basic/Digest Authentication —— 基本/摘要式的身份认证
  • Elegant Key/Value Cookies —— 优雅的 key/value Cookie
  • Automatic Decompression —— 自动解压
  • Automatic Content Decoding —— 自动内容解码
  • Unicode Response Bodies —— Unicode响应体
  • Multipart File Uploads —— 文件分块上传
  • HTTP(S) Proxy Support —— HTTP(S)代理支持
  • Connection Timeouts —— 连接超时
  • Streaming Downloads —— 流下载
  • .netrc Support —— 支持.netrc
  • Chunked Requests —— Chunked请求

有些听都听不懂,感觉很牛逼的样子,不方,跟着小猪撸一遍就好~
先通过 pip install request 安装一波库,然后就可以开始玩了!


2.三分钟上手requests

# 1.支持各种请求方式:GET,POST,PUT,DELETE,HEAD,OPTION
r1 = requests.get("http://xxx", params={"x": 1, "y": 2})
r2 = requests.post("http://xxx", data={"x": 1, "y": 2})
r3 = requests.put("http://xxx")
r4 = requests.delete("http://xxx")
r5 = requests.head("http://xxx")
r6 = requests.options("http://xxx")

注意

  • URL链接里有中文会自动转码
  • post时如果传递的是一个str而不是一个dict,会直接发送出去!(比如json字符串)
  • 2.4.2版新增:可以通过json参数传递dict,自动会把dict转换为json字符串!
  • post上传文件可以通过file参数,如post(url, files={‘file’: open(‘report.xls’, ‘rb’)})

请求的相关设置

  • 请求头headers={‘xxx’:’yyy’}
  • 代理proxies={‘https’:’xxx’}
  • 超时(单位秒)timeout=15

处理返回结果

注:由requests发起的请求,当相应内容经过gzipdeflate压缩时,
requests会自动解包,可以获得通过content获得byte方式的响应结果。

  • status_code:获取状态码
  • reason:状态信息
  • url:获取请求的url
  • content: 获取byte类型的返回结果,相当于urllib.urlopen().read;
  • raw:获得原始的返回结果,请求里需要设置stream=True
  • text:获取str类型的返回结果,会自动根据响应头部的字符编码进行解码;
    可以调用r.encoding获得编码方式,或者在调text之前先r.encoding=’编码’
    设置编码类型,text就会按照对应的编码进行解析;
  • json:解析序列化为JSON格式的数据,直接就可以[‘xxx’]拿数据了,
    如果解析错误会抛出异常:ValueError: No JSON object could be decoded

除此之外还可以调用headers获得响应头比如:

r = requests.get('http://gank.io/api/data/福利/50/1')
# 直接根据键获得值
print(r.headers.get('Date'))
# 遍历获得请求头里所有键值
for key, value in r.headers.items():
    print(key + " : " + value)

如果是想获取请求头信息的话:调用r.request.headers就可以获取了。
除此之外还有raise_for_status(),当响应码不是200的时候,会抛出
HTTPError异常,可用于响应码校验;

Cookie

通过r.cookies即可获得RequestsCookieJar对象,行为与字典类似;
如果想带着cookies去访问,可以在请求里添加cookies={‘xxx’:’yyy’}参数;
也可以通过requests.cookies.RequestsCookieJar()调用set方法进行构造,
比如:jar.set(‘gross_cookie’, ‘blech’, domain=’httpbin.org’, path=’/elsewhere’),可以调用下述方法遍历cookies:

for c in r.cookies:
    print(c.name + ":" + c.value)

附:CookieJar与字典间的互转

# 字典 -> CookieJar
cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)

# CookieJar-> 字典
cookies = requests.utils.dict_from_cookiejar(r.cookies) 

重定向与请求历史

除了HEAD请求,Requests会自动处理所有重定向,可以在执行请求的时候
使用allow_redirects=False禁止重定向,可以调用history函数追踪请求
历史,一个Response对象的列表,按照最老到最近的请求进行排序。

错误与异常

注:Requests 显式抛出 的异常都继承自requests.exceptions.RequestException

  • 1.遇到网络问题,会抛出ConnectionError异常
  • 2.请求超时,会抛出Timeout异常
  • 3.请求超过了设定的最大重定向次数,会抛出TooManyRedirects异常

Session会话对象

用于跨请求保持一些参数,最常见的就是保留cookies,
Session对象还提供了Cookie持久化和连接池功能,

s = request.Session() # 建立会话
s.post('http://xxx.login',data={'xx':'xx'}) # 登录网址
s.get('http://xxx.user') # 登录后才能访问的网址
s.close() # 关闭会话

3.Requests实战:抓取微信文章的图片与视频

推理分析环节

随手打开一个微信链接:http://mp.weixin.qq.com/s/JHioeDcopm-98R5lGVemqw

  • 1.标题 拿来做文件夹名字,很好拿,直接title标签

  • 2.获取图片:不难发现图片的标签是这样的

可以通过下面这段代码拿到:

然后呢,图片可能是PNG,JPEG或者GIF,观察data-src可以看到:
尾部有个wx_fmt=jpegsplit[‘=’][-1]就能拿到文件格式,图片名的
话:url.split(“/”)[-2],就有了这样一段下载图片的代码:

  • 3.获取音频

这个就需要取巧了,直接看网页结构的话:

src里的链接粘贴赋值是不能打开的,这个mpvoice貌似是采用的是
js渲染模块方案,安卓狗表示不知道是什么,有兴趣的可以看下这篇
文章:http://m.dian321.com/keji/1174796.html
感觉一时半伙也找不出规则,要不走一波手机抓包?

啧啧,原来就这么简单,所有只需要拿到mediaid就可以啦,
而刚好就是voice_encode_fileid属性,然后音频名就直接用
时间戳.mp3的格式来命名把,所以有了下面两段代码:

  • 4.获取视频

这个就不好搞了,内嵌在iframe里,貌似是一个flash播放器

复制了下url,网页重新打开:

同样是拿不到,手机抓一波包?

看到vkey这么长,猜都猜到是加密后的东西了,要去推敲不知
得花到何年何月了,有没有什么取巧的办法呢?对了,差点忘
了我妹用的那个视频链接获取网站 http://v.ranks.xin/

贴视频地址,然后解析视频,就可以得到可下载的视频超链接了,
把前面那个src的链接贴下,清下chrome解析那里,然后准备抓包,
点下解析后,可以看到发出了一个这样的请求:

点开,咦,这不是上一节我们刚了解的Ajax动态加载技术吗?

一点不方,还有点鸡冻,(≧▽≦)/
看下Preview,哟哟,这难道是我们想要的超链接?

复制粘贴,右键看下能否另存为?

稳如狗,接着就来一波解析,还有下载视频的代码咯:

核心的东西就这些啦,接着就简单了,写一个无限While循环,
然后获取用户的输入,然后输入Q直接exit()就可以了~

随手试两篇文章,运行结果:

可以,很Gay,都抓到了,美滋滋~
另外如果出现Max retries exceeded with url这样的异常,可能就是
你的requests库太旧了,可以走一波:pip install –upgrade requests
进行升级。


4.使用pyinstaller生成exe文件

脚本是有了,你也不可能在我妹电脑上装个Python环境吧?
可以通过pyinstaller来生成一波exe文件,然后就可以在我
妹的渣渣win本上运行了。

键入:pip install pyinstaller,安装pyinstaller

新建一个文件夹,然后把我们的脚本拷进去,我们还可以弄个应用图标

接着命令行走一波:

pyinstaller -F -i wechat.ico CatchWeChatRes.py

执行成功后能看到文件夹下多了几个文件:

如果正常生成了exe文件的话,是可以在dist目录下找到的。

双击执行,贴个文章的url:

成功下载到本地,没毛病~

Tips

-i 是可选参数,代表有错误也继续执行
-w 如果不需要命令行,可以加上-w

编译中途出现过这个错误:

执行不了脚本,后来发现是手多在文件里import了无关模块,删掉就可以了;


5.小结

本来昨天就应该写完了,因为公司搬家的原因,还有因为太冷
起不了床的原因,拖到下午才补完,尴尬~

后面会学Python里自带的图形化模块Tkinter,到时再拼凑一个
简单的图形化界面界面吧~


本节源码下载

https://github.com/coder-pig/ReptileSomething


来啊,Py交易啊

想加群一起学习Py的可以加下,智障机器人小Pig,验证信息里包含:
PythonpythonpyPy加群交易屁眼 中的一个关键词即可通过;

验证通过后回复 加群 即可获得加群链接(不要把机器人玩坏了!!!)~~~
欢迎各种像我一样的Py初学者,Py大神加入,一起愉快地交流学♂习,van♂转py。


  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,让我们开始Python模拟登录imooc.com的练习。 首先,我们需要导入需要的,包括requests和BeautifulSoup。requests用于发送http请求,BeautifulSoup用于解析html文本。 ```python import requests from bs4 import BeautifulSoup ``` 接下来,我们需要获取登录页面的html代码。我们可以使用requests的get()方法来发送一个get请求,并将返回的html代码存储在一个变量中。 ```python login_url = 'https://www.imooc.com/' login_page = requests.get(login_url) login_soup = BeautifulSoup(login_page.text, 'html.parser') ``` 接下来,我们需要从登录页面中获取登录所需的信息,包括表单的action、method、以及需要提交的表单数据。我们可以使用BeautifulSoup来解析html代码,并使用find()方法来查找表单元素。 ```python # 获取登录表单元素 login_form = login_soup.find('form', attrs={'id': 'signup-form'}) # 获取表单的action和method action_url = login_form['action'] method = login_form['method'] # 获取需要提交的表单数据 email = input('请输入邮箱:') password = input('请输入密码:') data = { 'email': email, 'password': password } ``` 接下来,我们可以使用requests的post()方法来发送一个post请求,将表单数据提交到服务器。需要注意的是,我们需要将表单数据和请求头一起提交到服务器。 ```python # 构造请求头 headers = { 'Referer': login_url, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 发送post请求 response = requests.post(action_url, data=data, headers=headers) ``` 最后,我们可以判断登录是否成功,可以通过检查返回的html代码中是否包含登录成功的提示信息来判断。 ```python # 判断登录是否成功 if '个人中心' in response.text: print('登录成功!') else: print('登录失败!') ``` 完整代码如下: ```python import requests from bs4 import BeautifulSoup # 获取登录页面html代码 login_url = 'https://www.imooc.com/' login_page = requests.get(login_url) login_soup = BeautifulSoup(login_page.text, 'html.parser') # 获取登录表单元素 login_form = login_soup.find('form', attrs={'id': 'signup-form'}) # 获取表单的action和method action_url = login_form['action'] method = login_form['method'] # 获取需要提交的表单数据 email = input('请输入邮箱:') password = input('请输入密码:') data = { 'email': email, 'password': password } # 构造请求头 headers = { 'Referer': login_url, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 发送post请求 response = requests.post(action_url, data=data, headers=headers) # 判断登录是否成功 if '个人中心' in response.text: print('登录成功!') else: print('登录失败!') ``` 注意,此代码仅供学习参考。在实际应用中,请勿使用模拟登录的方式获取个人信息,以免造成不必要的风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值