Requests函数库是学习Python爬虫必备之一, 能够帮助我们方便地爬取. Requests: 让HTTP服务人类. 本文主要参考了其官方文档.

Requests具有完备的中英文文档, 能完全满足当前网络的需求, 它使用了urllib3, 拥有其所有的特性!

Requests安装:

requests目前的版本是v2.11.1, 在WINDOWS上可以通过命令行窗口(运行cmd命令), 利用pip进行自动地安装(很方便):

> pip install requests
Collecting requests
Downloading requests-2.11.1-py2.py3-none-any.whl <514kB>
Installing collected packages: requests
Successfully installed requests-2.11.1

向网站发送请求:requests.get(url)

>>> import requests

# 请求豆瓣读书网站点
>>> r = requests.get('https://book.douban.com/') # 返回一个实例,包含了很多的信息
>>> r.status_code # 响应状态码,200表示服务器已成功处理了请求
200
>>> r.headers['content-type'] # 浏览器根据该参数决定对文档进行如何解析,text是文档类型,html则是文档子类型;
'text/html; charset=utf-8'
>>> r.encoding # 所请求网页的编码方式
'utf-8'
>>> r.text # 所请求网页的内容
...
>>> r.cookie # 网页的cookie内容
<RequestsCookieJar[Cookie(version=0, name='bid', value='mGadkt5VXtk', port=None, port_specified=False, domain='.douban.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1508551773, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
>>> r.headers # 网页的头
{'X-Xss-Protection': '1; mode=block', 'X-DAE-App': 'book', 'X-Content-Type-Options': 'nosniff', 'Content-Encoding': 'gzip', 'Transfer-Encoding': 'chunked', 'Set-Cookie': 'bid=mGadkt5VXtk; Expires=Sat, 21-Oct-17 02:09:33 GMT; Domain=.douban.com; Path=/', 'Expires': 'Sun, 1 Jan 2006 01:00:00 GMT', 'Vary': 'Accept-Encoding', 'Keep-Alive': 'timeout=30', 'X-DAE-Node': 'dis16', 'X-DOUBAN-NEWBID': 'mGadkt5VXtk', 'X-Douban-Mobileapp': '0', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'must-revalidate, no-cache, private', 'Date': 'Fri, 21 Oct 2016 02:09:33 GMT', 'Strict-Transport-Security': 'max-age=15552000;', 'Server': 'dae', 'Content-Type': 'text/html; charset=utf-8'}
>>> r.url # 实际的网址
u'https://book.douban.com/'

       HTTP定义了与服务器进行交互的不同方式, 其中, 最基本的方法有四种: GET, POST, PUT, DELETE; 一个URL对应着一个网络上的资源, 这四种方法就对应着对这个资源的查询, 修改, 增加, 删除四个操作.上面的程序用到的requests.get()来读取指定网页的信息, 而不会对信息就行修改, 相当于是"只读". requests库提供了HTTP所有基本的请求方式, 都是一句话搞定:

 r = requests.post('https://book.douban.com/')
r = requests.put('https://book.douban.com/')
r = requests.delete('https://book.douban.com/')
r = requests.head('https://book.douban.com/')
r = requests.options('https://book.douban.com/')

向URL传递参数:requests.get(url, param=None)

参考附录1可知,一个URL的?后面跟随的是查询(query)字符串, 现在我们手工构建URL, 向URL的后面传递查询字符串. request.get()的第二个参数允许我们使用params关键字参数,以一个字典的形式来提供参数, 比如我们想传递key1=value1,key2=value2到http://httpbin.org/get里面,可以这样做:

>>> param = {'key1':'value1', 'key2':'value2'}  # 先生成一个字典
>>> param
{'key2': 'value2', 'key1': 'value1'}
>>> r = requests.get('http://httpbin.org/get', params = param)
>>> r.url
u'http://httpbin.org/get?key2=value2&key1=value1' # 可以看到,参数之间用&隔开,参数名和参数值之间用=隔开 # 还可以将一个列表作为参数值传入
>>> param = {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> param
{'key2': ['value2', 'value3'], 'key1': 'value1'}
>>> r = requests.get('http://httpbin.org/get', params=param)
>>> r.url
u'http://httpbin.org/get?key2=value2&key2=value3&key1=value1'

响应内容:

现在我们可以对服务器响应的内容进行读取, 响应的内容存放在了r.text里面.

>>> r = requests.get('https://www.douban.com/')
>>> r.status_code
200>>> r.encoding
'utf-8'

图1 在豆瓣网上"查看源代码"得到的部分内容

图2 r.text的部分内容

图3 r.content的部分内容

从图1,图2可以看出: 1) 网页响应的内容就是网页的源代码.2) r.text和r.content都是经过了编码的,图1和图2中红线部分为"提供图书"的编码:图1为Unicode编码16进制,图2为'ISO-8859-1'编码.

图4 "提供图书"四个汉字的编码

当你访问r.text之时,requests会使用r.encoding的编码格式进行编码, 如果你把r.encoding的值改变了, 再访问t.text的时候, 它就会按照新的编码形式进行编码.如下所示将'utf-8'编码改成'ISO-8859-1',再访问r.text,得到如图5所示的内容:

>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

图5 用了'ISO-8859-1'的编码

那r.text和r.content的区别是什么呢?

r.text是unicode编码的响应内容(r.text is the content of the response in unicode), r.content是字符编码的响应内容(r.content is the content of the response in bytes); text属性会尝试按照encoding属性自动将响应的内容进行转码后返回,如果encoding为None,requests会按照chardet(这是什么?)猜测正确的编码; 如果你想取文本,可以通过r.text, 如果想取图片,文件,则可以通过r.content(这点我现在也不是很明白).针对响应内容是二进制文件(如图片)的场景,content属性获取响应的原始内容(以字节为单位),例如:

from PIL import Image
from io import BytesIO r = requests.get('http://pic6.huitu.com/res/20130116/84481_20130116142820494200_1.jpg')
i = Image.open(BytesIO(r.content)) # 得到图像
i.save('sample.jpg', 'jpeg') # 保存图像

图6 图片的r.content内容

JSON响应内容:

requests内置了一个JSON解码器, 帮助处理JSON数据,JSON的简介见附录2.

>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
{u'documentation_url': u'https://developer.github.com/v3/activity/events/#list-public-events', u'message': u'Hello there, wayfaring stranger. If you\u2019re reading this then you probably didn\u2019t see our blog post a couple of years back announcing that this API would go away: http://git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead.'}
>>> r.json
<bound method Response.json of <Response [410]>>

附录:

1.URL组成:

基本的URL的格式为: "协议://授权/路径?查询", 如在百度上分别搜索"Brad Pitt"和"url", 出来的URL如下所示, 协议为: https(用安全套接字层传送的超文本传输协议), 授权为: www.baidu.com, 路径为: s, 查询为: ?后面的一坨.

搜索"Brad Pitt", 出来的URL是:https://www.baidu.com/s?wd=Brad%20Pitt&rsv_spt=1&rsv_iqid=0xf7315fbc0002f13b&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2&rsv_n=2&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&inputT=364&rsv_sug4=530&rsv_sug=1

搜索"url", 出来的URL是:https://www.baidu.com/s?wd=url&rsv_spt=1&rsv_iqid=0xed90010e00032652&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1

URL由三部分组成: 资源类型, 存放资源的主机域名, 资源文件名. URL的一般语法为([]里面的为可选项): protocol://hostname[:port]/path/[:parameters][?query]#fragmentpro

protocol: 协议,最常用的是HTTP协议;hostname: 主机名,指用来存放资源的服务器的域名系统(DNS)主机名或IP地址;post: 端口号,整数,可选,各种协议都有默认的端口号(http的80端口),忽略的时候采用方案的默认端口; path: 路径, 一般用来表示主机上的一个目录或者文件地址; parameters: 参考(可选),用于指定特殊参数.query: 查询,用于给动态网页(如使用PHP/ASP/NET的技术制作的网页)传递参数,可以有多个参数, 用符号"&"隔开,每个"参数名:参数值"用"="隔开. fragment: 信息片段,是个字符串,用于指定网络资源中的片段.

2.JSON:

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式, 作为数据交换语言, 易于人阅读和编写, 同时也易于机器解析和生成. JSON数据的书写格式是: 名称:值 对.中间用:隔开(这个就像python的dict定义嘛). 如: r'documentation_url': u'https://developer.github.com/v3/activity/events/#list-public-events'.

参考:

[1] Python爬虫利器一之Requests库的用法: https://cuiqingcai.com/2556.html

[2] Requests: 让HTTP服务人类(中文官方文档): http://cn.python-requests.org/zh_CN/latest/

[3] http://docs.python-requests.org/zh_CN/latest/user/advanced.html

[4] 浅谈HTTP中Get与Post的区别: http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html

[5] W3School-HTML/CSS: http://www.w3school.com.cn/html/html_forms.asp

Python爬虫学习1: Requests模块的使用的更多相关文章

  1. Python爬虫学习三------requests+BeautifulSoup爬取简单网页

    第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...

  2. python爬虫中的requests模块

    Requests: 让 HTTP 服务人类 一.简介 虽然Python的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests ...

  3. 吴裕雄--天生自然python爬虫:使用requests模块的get和post方式抓取中国旅游网站和有道翻译网站翻译内容数据

    import requests url = 'http://www.cntour.cn/' strhtml = requests.get(url) print(strhtml.text) URL='h ...

  4. 爬虫简介与requests模块

    爬虫简介与requests模块 一 爬虫简介 概述 网络爬虫是一种按照一定规则,通过网页的链接地址来寻找网页的,从网站某一个页面(通常是首页)开始,读取网页的内容,找到网页中的其他链接地址,然后通过这 ...

  5. python爬虫学习(1) —— 从urllib说起

    0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...

  6. python爬虫学习 —— 总目录

    开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...

  7. Python 爬虫入门(requests)

    相信最开始接触Python爬虫学习的同学最初大多使用的是urllib,urllib2.在那之后接触到了第三方库requests,requests完全能满足各种http功能,真的是好用爆了 :D 他们是 ...

  8. python爬虫学习笔记(一)——环境配置(windows系统)

    在进行python爬虫学习前,需要进行如下准备工作: python3+pip官方配置 1.Anaconda(推荐,包括python和相关库)   [推荐地址:清华镜像] https://mirrors ...

  9. Python爬虫与数据分析之模块:内置模块、开源模块、自定义模块

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

随机推荐

  1. SDNnet PX Programmming Language

    写在前面 本篇是关于 SDNet PX Programming Language User Guide 其中「Introduction」 部分的一些翻译.理解以及我从其他方面看来的一些资料的整合.网上 ...

  2. 【codeforces 528D】 Fuzzy Search

    http://codeforces.com/problemset/problem/528/D (题目链接) 题意 给定母串和模式串,字符集大小为${4}$,给定${k}$,模式串在某个位置匹配当且仅当 ...

  3. JS的作用域和闭包

    1.作用域 作用域是根据名称找变量的一套规则. 变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它 ...

  4. 【线段树】【CF1083C】 Max Mex

    Description 给定一棵有 \(n\) 个点的树,每个节点有点权.所有的点权构成了一个 \(0~\sim~n - 1\) 的排列.有 \(q\) 次操作,每次操作 \(1\) 为交换两个点的点 ...

  5. 预读(读取文件前几行)文件(txt,dat,csv等)程序

    需求: txt.dat.csv文件很大,需要花很长的时间打开, 但实际上我们只需要查看文件的前几行,查看数据的内容和格式 exe & code :  https://github.com/co ...

  6. python---requests和beautifulsoup4模块的使用

    Requests:是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得 ...

  7. js+css3实现旋转效果

    我的前面一张文章实现了用css3制作旋转的效果,现在呢,我换另外一种方法来实现.就是使用js结合css3的方法来实现的.下面我就先上图给大家看看效果吧 下面呢我先放上我的css代码,代码很简单: .o ...

  8. 2015/11/5用Python写游戏,pygame入门(5):面向对象的游戏设计

    昨天的内容里有了运动的子弹,虽然我们只添加了一个子弹,但你可以看到我们需要记录子弹的x,y坐标,每次要更新它的坐标.如果我们想要有多颗子弹,就需要存储多个坐标.那时候处理起来就不显得那么简单,也许我们 ...

  9. Linux装机利器Cobbler安装配置

     Linux装机利器Cobbler安装配置 2011-05-27 15:31:05 分类: LINUX 一.安装环境 centos 5.4 关掉iptables 关掉 selinux selinux ...

  10. Java并发编程原理与实战三:多线程与多进程的联系以及上下文切换所导致资源浪费问题

    一.进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而 ...