Requests是python的一个HTTP客户端库,几乎可以解决我们遇到的任何爬虫问题,其强大简洁的API足以让人体会到python的优雅。

Windows下安装通过

  •  
pip install requests

 

之后可以在CMD下运行 python

03 | Python爬虫库_Python


 

 

2. 要使用requests,首先推荐阅读requests的官方文档
  •  
https://2.python-requests.org//zh_CN/latest/user/quickstart.html

 

HTTP请求中我们通常只会用GET和POST,requests对于区分了两种不同的请求方式。分别是带参数和不带参数,下边给出实例:

不带参数

  •  
https://www.baidu.com

 

带参数

  •  
https://www.baidu.com/s?wd=python

 

判断URL是否带有参数,可以通过对符号?的判断。一般网站URL后边带有?说明带有参数,参数的规则如下

1)?后接参数

2)参数之间用&连接

Requests 实现 GET 请求,对可带参数的 URL 有两种方式:基本使用示例

3. 基本使用示例:

03 | Python爬虫库_Python_02

 

  •  
# 解析if __name__ == '__main__':    main()# 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');# 在你自己眼中,你是你自己(__name__ == '__main__')。
# if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
参数

03 | Python爬虫库_Requests_03

 

方法二:(更推荐下图方法二,也就是上图方法)

优点:

两种方法都可以,实际开发中建议第一种,因为更加简洁优雅,体现了python的语法。

也就是:

  • 方便传输参数

  • 方便维护

  • 方便调试

  • 耦合性低,模块化

03 | Python爬虫库_Python_04

那多个参数怎么传呢?
  •  
import requests
url = 'https://www.baidu.com'
params = {'wd':'python', 'pn': 'C#'}response = requests.get(url, params = params)print(response.url)
# 输出https://www.baidu.com/?wd=python&pn=C%23

 

4. POST方法就是我们日常生活中提交表单的方法,比如登录验证之类的。Requests实现的POST需要传递参数data,可以使字典或者json结构,或者元组,列表等。

03 | Python爬虫库_Python_05

需要注意的是,GET请求传递的是params,POST传递的是data,不能混淆二者。

此外,服务器返回的信息里包含了许多我们需要的数据,比如

Html.status_code 相应状态码
Html.raw 原始响应体
Html.content 字节响应体,需要解码
Html.text 字符串的响应方式
Html.headers 服务器响应头
Html.josn() requests内置的json解码器
Html.cookies 获取请求后的cookies
Html.encoding 获取编码格式

 

Post 使用示例二

03 | Python爬虫库_Python_06


    

请求json数据

 

03 | Python爬虫库_Requests_07

之前有很多小伙伴问我,如何抓取腾讯新闻,那么我今天要告诉你,它来了:

  •  
# -*- coding: utf-8 -*-# @Author     :AI悦创# @DateTime   :2019/9/14  16:10 # @FileName   :newsqq_title.PY# @Function   :功能# Development_tool   :PyCharm# <-------import data-------------->import requests
url = 'https://news.qq.com/ext2020/apub/json/prevent.new.json'html = requests.get(url)
base_url = 'https://new.qq.com/omn/20190913/'if html.status_code == 200: for title in html.json(): print(title['id'], title['title'],'详情页网址:>', base_url + title['id']) # 详情页的数据就再进一步请求即可 # 输出"C:\Program Files\Python37\python.exe" D:/daima/pycharm_daima/爬虫大师班/newsqq_title.py20190724V0BAZH 河北怀来气体中毒事故续:5人因救人中毒 进现场2分钟就晕倒 详情页网址:> https://new.qq.com/omn/20190913/20190724V0BAZH20190723A0RQDR 广西桂林一景区女浴室内装摄像头,16名女游客报警维权 详情页网址:> https://new.qq.com/omn/20190913/20190723A0RQDR20190724V0WL4T 紧急呼叫丨湖南男子称被警察打伤续 拉架者:无故被打望道歉赔偿 详情页网址:> https://new.qq.com/omn/20190913/20190724V0WL4T20190727A06E37 山西一刑释人员控制“村两委”:带打手到医院砍人,打断村民四肢 详情页网址:> 中间大部分省略。。。。。。https://new.qq.com/omn/20190913/20190727A06E37https://new.qq.com/omn/20190913/20190913V006UZ20190913V049GN “你刚举报我了?”记者举报非法生产 10分钟后神秘人打来电话 详情页网址:> https://new.qq.com/omn/20190913/20190913V049GN20190912A0QQJT 广州一24岁女教师在校内离奇死亡 去世前一天还给家里转账 详情页网址:> https://new.qq.com/omn/20190913/20190912A0QQJT20190912A0R6DY 华中科技大学研究生跳楼身亡 校方:停止导师研究生招生资格两年 详情页网址:> https://new.qq.com/omn/20190913/20190912A0R6DY20190913V00KE3 深圳一小区高空锯树砸死路过老人:事发时正带着小孩散步 详情页网址:> https://new.qq.com/omn/20190913/20190913V00KE3
进程已结束,退出代码 0

咱们今天写个小爬虫,百度图片:

 

我们可以发现是以30为基准的,每30 一个

 

03 | Python爬虫库_Requests_08

 

注意,这里爬取的百度图片是 Ajax 所以图片获取和你实际页面看的不一样。

03 | Python爬虫库_Requests_09

上面的也是QQ新闻的,简单爬虫。

那百度图片呢?

因为,我是分开写的。不好都显示出来,您可以通过以下方式获取完整代码

1,公众号后台回复:baidu_img

2,点击我朋友圈里的相关代码链接

接下来,下载音视频

03 | Python爬虫库_Requests_10

 

2

.构建复杂请求

 

维持会话:

03 | Python爬虫库_Requests_11

 

requests.get():

是单个独立的,服务器认为是两个不同的人访问的。

这样就会出现许多的样板代码,就类似于每次get都需要加headers

Session 的好处

03 | Python爬虫库_Python_12

 

忽略HTTPS证书验证

 

03 | Python爬虫库_Requests_13

 

ip代理

03 | Python爬虫库_Python_14

 

 

3  上传与下载上传文件

03 | Python爬虫库_Requests_15

 

file:文件名称(固定的)

render:起个名字然后打开

application/html:文件格式(html 换成txt等)

Expires:过期时间

文件下载:

03 | Python爬虫库_Requests_16

 

 
Urllib 补充
  •  
# Urllib 常用 API
1. urllib.parse.urljoin2. urllib.parse.quote3. urllib.parse.urlsplit4. urllib.parse.urlparse
1. urllib.parse.urljoinfrom urllib import parse
domain = 'https://bilbil/com/'url = '/img_1234'res = domain + urlprint('不使用库:>>>', res)res = parse.urljoin(domain, url)print('使用urllib:>>>', res)
# 输出不使用库:>>> https://bilbil/com//img_1234使用urllib:>>> https://bilbil/img_1234[Finished in 0.2s]

2. urllib.parse.quotefrom urllib import parse
text = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=&1568645521643='unquote = parse.unquote(text)print(unquote,'\n\n')
quote = parse.quote(text)print(quote)
# 输出http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=壁纸&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=壁纸&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=&1568645521643=

http%3A//image.baidu.com/search/acjson%3Ftn%3Dresultjson_com%26ipn%3Drj%26ct%3D201326592%26is%3D%26fp%3Dresult%26queryWord%3D%25E5%25A3%2581%25E7%25BA%25B8%26cl%3D2%26lm%3D-1%26ie%3Dutf-8%26oe%3Dutf-8%26adpicid%3D%26st%3D-1%26z%3D%26ic%3D0%26hd%3D%26latest%3D%26copyright%3D%26word%3D%25E5%25A3%2581%25E7%25BA%25B8%26s%3D%26se%3D%26tab%3D%26width%3D%26height%3D%26face%3D0%26istype%3D2%26qc%3D%26nc%3D1%26fr%3D%26expermode%3D%26force%3D%26cg%3Dwallpaper%26pn%3D60%26rn%3D30%26gsm%3D%261568645521643%3D[Finished in 0.2s]
3. urllib.parse.urlsplit4. urllib.parse.urlparse
from urllib import parse
url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result'print(parse.urlsplit(url)) # 分割# print(quote == text)print(parse.urlparse(url)) # 解析(高级一些)
# 输出SplitResult(scheme='http', netloc='image.baidu.com', path='/search/acjson', query='tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result', fragment='')ParseResult(scheme='http', netloc='image.baidu.com', path='/search/acjson', params='', query='tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result', fragment='')[Finished in 0.2s]

拓展:

  •  
url='&rsv_sug7=001&rsv_n=2&rsv_sug2=0&prefixsug=https%253A%252F%252Fwww.raspberrypi.org%252Fdownloads%252F&rsp=6&rsv_sug9=es_0_1&inputT=1489&rsv_sug4=1502&rsv_sug=9'

 

如上url,我们可能会对百分号后的内容产生疑问而unquote的作用就是翻译它们的,(url内容变我们所能理解的语言)quote(将我们的语言转换成类似内容)以下是代码:

 

  •  
from urllib import parse
print(parse.unquote('我们要翻译的url中%后的内容'))
print(parse.quote('我们要翻译的汉字')