一:Requests: 让 HTTP 服务人类

虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用:)

Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。

requests 的底层实现其实就是 urllib3

Requests的文档非常完备,中文文档也相当不错。Requests能完全满足当前网络的需求,支持Python 2.6—3.5,而且能在PyPy下完美运行。

开源地址:https://github.com/kennethreitz/requests

中文文档 API: http://docs.python-requests.org/zh_CN/latest/index.html

二:安装方式

 1.强烈建议大家使用pip进行安装:pip insrall requests

 2.Pycharm安装:file-》default settings-》project interpreter-》搜索requests-》install package-》ok

三、requests库的get请求

1、最简单的爬虫程序(get请求)

#!/usr/bin/env python
# -*- coding:utf-8 -*- #需求:使用requests模块想百度首页面发起一个get请求,获取响应对象
import requests
if __name__ == "__main__":
#指定请求的url地址
url = 'http://www.baidu.com'
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象
response = requests.get(url)
#打印响应对象(结果:响应对象类型和响应状态码)
print(response)

2.响应对象的相关属性操作:

#!/usr/bin/env python
# -*- coding:utf-8 -*- #需求:使用requests模块想百度首页面发起一个get请求,获取响应对象
import requests
if __name__ == "__main__":
#指定请求的url
url = 'http://www.baidu.com'
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象
response = requests.get(url) #获取请求的url
print('请求的url:'+response.url) #获取响应状态码
print(response.status_code) #获取响应内容的编码格式,可以通过该属性修改响应的编码格式,直接以赋值的形式就可以修改响应的编码方式,一般出现乱码是我们需要进行设置
print('响应内容编码:'+response.encoding) #获取响应对象的响应头信息:
print(response.headers) #获取字符串形式的响应内容,即是我们通过审查元素看到的HTML内容
print(response.text) #获取字节形式的响应内容,是bytes类型,一般我们请求图频、音频、视频需要用到字节流形式的响应内容
print(response.content)

3.定制请求头信息:

  在请求头中有一个参数为User-Agent,表示含义为请求载体的身份标识。通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。爬虫程序想要尽可能的模拟浏览器发起的请求,则必须将User-Agent修改成浏览器的身份标识。

【注意】User-Agent的定制其实是一种反反爬虫的初级技术手段。所以在编写爬虫程序时,必须对User-Agent进行手动定制。User-Agent的值可以通过抓包工具从浏览器请求的请求头中获取。

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
if __name__ == "__main__":
#指定请求的url
url = 'http://www.baidu.com'
#定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象
#参数1:发起请求指定的url
#参数2:手动定制的请求头信息
response = requests.get(url=url,headers=headers)
#打印响应的状态码
print(response.status_code)

4.将响应的网页内容写入磁盘进行存储:将爬取到的百度首页的网页数据写入磁盘进行存储

  【注意】如果写入到文件中的网页数据出现了乱码,则需要手动将响应内容的编码格式进行设置

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
if __name__ == "__main__":
#指定请求的url
url = 'http://www.baidu.com'
#定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象,get的参数
#参数1:发起请求指定的url
#参数2:手动定制的请求头信息
response = requests.get(url=url,headers=headers)
#设置响应内容的编码格式(如果写入文件内容出现乱码的话)
response.encoding = 'utf-8'
#获取响应的网页内容
page_data = response.text
  #将响应的内容写到我们指定的文件中
with open('./baidu.html','w') as fp:
fp.write(page_data)

5.携带参数的get请求:将携带的参数以键值对的形式封装到一个字典中,然后在get方法的params参数中使用即可

  【注意】url有一个显著的特性。url必须是使用ASCII进行编码的字符方可生效。但是在requests模块中,即使url中存在非ASCII字符,那么requests会对其自动进行转化。urllib3则需要大家手动使用urlencode函数进行转换。

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
if __name__ == "__main__":
#指定请求的url:可以将get请求携带的参数拼接到url域名后面,但是不建议大家这么做,一般我们将携带的参数以键值对的形式封装到字典中,操作见下方:
#url = 'http://www.baidu.com/s?ie=utf-8&wd=周杰伦' #建议做法:指定请求网页的域名
url = 'https://www.baidu.com/s'
#将请求携带的参数以键值对的形式封装到字典中,准备待用
param = {
'ie' : 'utf-8',
'wd' : '星星'
}
#定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象,get中传入的三个参数如下:
#参数1:发起请求指定的url
#参数2:手动定制的请求头信息
#参数3:指定请求携带的参数
response = requests.get(url=url,headers=headers,params=param)
#设置响应内容的编码格式(如果写入文件内容出现乱码的话)
response.encoding = 'utf-8'
#获取响应的网页内容,存储的文件名我们也可以根据用户输入,存成一个动态文件名
page_data = response.text
with open('./星星.html','w') as fp:
fp.write(page_data)

6.使用get请求下载二进制数据(图片,音频,视频等)进行持久化存储

方法一:

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
if __name__ == "__main__": #指定一张网络图片的url
url = 'http://img05.tooopen.com/images/20141217/sy_77493739982.jpg' #定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,来伪装成一个浏览器,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象
response = requests.get(url=url,headers=headers) #获取响应的网页内容(该内容为图片,应该获取二进制类型数据)
image_data = response.content
#将获取的二进制网页内容存储到文件中
with open('./image.jpg','wb') as fp:
fp.write(image_data)

方法二:

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
import urllib.request
if __name__ == "__main__": #指定一张网络图片的url
url = 'http://img05.tooopen.com/images/20141217/sy_77493739982.jpg'#使用urllib模块进行图片下载
urllib.request.urlretrieve(url=url,filename='image.jpg')

四.requests模块的post请求

  1.爬取百度翻译:在百度翻译中输入一个需要翻译的词条,然后进行post请求的发送,使用抓包工具抓取该请求(https://fanyi.baidu.com/sug)

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
import urllib.request
if __name__ == "__main__": #指定post请求的url
url = 'https://fanyi.baidu.com/sug' #定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,将爬虫伪装的更像浏览器,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
} #定制post请求携带的参数,可以使用抓包工具看需要传哪些参数,如Fiddler抓包工具
data = {
'kw' : 'dog'
}
#使用requests模块的post函数根据指定的url发起一个post请求,post函数返回一个响应对象
#参数1:发起请求指定的url
#参数2:手动定制的请求头信息
#参数3:指定请求携带的参数
response = requests.post(url=url,headers=headers,data=data) #获取响应内容:响应内容为json串
print(response.text)

【注意】在使用爬虫程序进行网页数据爬取的时候,可能会出现爬取不到数据的时候,究其问题所在,是因为我们的爬虫程序还是没有尽可能的模拟浏览器发送请求。如何尽可能的模拟浏览器发起请求呢?我们需要将我们爬虫程序中的请求头信息和请求所带的参数尽可能的保持和浏览器中的请求头信息和参数保持一致。

五.requests模块的基于ajax的get请求:

  案例:爬取豆瓣网 https://movie.douban.com/ 的分类排行榜中电影的数据信息

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
import urllib.request
if __name__ == "__main__": #指定ajax-get请求的url(通过抓包进行获取)
url = 'https://movie.douban.com/j/chart/top_list?' #定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
} #定制get请求携带的参数(从抓包工具中获取字典中需要传入哪些参数)
param = {
'type':'',
'interval_id':'100:90',
'action':'',
'start':'',
'limit':''
}
#发起get请求,获取响应对象
response = requests.get(url=url,headers=headers,params=param) #获取响应内容:响应内容为json串
print(response.text)

六.requests模块的基于ajax的post请求:

  案例:肯德基餐厅查询数据爬取 http://www.kfc.com.cn/kfccda/index.aspx

#!/usr/bin/env python
# -*- coding:utf-8 -*- import requests
import urllib.request
if __name__ == "__main__": #指定ajax-post请求的url(通过抓包进行获取)
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' #定制请求头信息,相关的头信息必须封装在字典结构中
headers = {
#定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
} #定制post请求携带的参数(从抓包工具中获取字典中需要传入哪些参数)
data = {
'cname':'',
'pid':'',
'keyword':'北京',
'pageIndex': '',
'pageSize': ''
}
#发起post请求,获取响应对象
response = requests.get(url=url,headers=headers,data=data) #获取响应内容:响应内容为json串
print(response.text)

七.综合练习:

  需求:输入吧名,输入起始页码和结束页码,然后在当前文件夹中创建一个以吧名为名字的文件夹,里面是每一页html内容,文件名是 吧名_当前页码.html

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import os
if __name__ == "__main__": url = 'http://tieba.baidu.com/f?'
name = input('enter name:')
s_pageNum = int(input('enter start pageNum:'))
e_pageNum = int(input('enter end pageNum:'))
# 创建一个存储html文件的文件夹
if not os.path.exists(name):
os.mkdir(name) for page in range(s_pageNum, e_pageNum + 1):
print('开始下载第%d页的内容' % page)
param = {
"kw": name,
"ie": 'utf-8',
"pn": (page - 1) * 50
} #发起请求,获取响应对象。不要定制头信息
response = requests.get(url=url,params=param)
#response.encoding = 'utf-8'
page_content = response.text fileName = name+'_'+str(page)+'.html'
filePath = name+'/'+fileName
with open(filePath,'w') as fp:
fp.write(page_content)

Python爬虫之requests库介绍(一)的更多相关文章

  1. python爬虫之requests库介绍(二)

    一.requests基于cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们 ...

  2. python爬虫之requests库

    在python爬虫中,要想获取url的原网页,就要用到众所周知的强大好用的requests库,在2018年python文档年度总结中,requests库使用率排行第一,接下来就开始简单的使用reque ...

  3. Python爬虫:requests 库详解,cookie操作与实战

    原文 第三方库 requests是基于urllib编写的.比urllib库强大,非常适合爬虫的编写. 安装: pip install requests 简单的爬百度首页的例子: response.te ...

  4. Python爬虫之requests库的使用

    requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 "HTTP for ...

  5. python爬虫之requests模块介绍

    介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内容下 ...

  6. 【Python爬虫】Requests库的基本使用

    Requests库的基本使用 阅读目录 基本的GET请求 带参数的GET请求 解析Json 获取二进制数据 添加headers 基本的POST请求 response属性 文件上传 获取cookie 会 ...

  7. python爬虫(1)requests库

    在pycharm中安装requests库的一种方法 首先找到设置 搜索然后安装,蓝色代表已经安装 requests库中的get请求 与HTTP协议相对应,requests库也有七种请求方式. 获取ur ...

  8. python爬虫之urllib库介绍

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  9. Python爬虫之Requests库的基本使用

    import requests response = requests.get('http://www.baidu.com/') print(type(response)) print(respons ...

随机推荐

  1. php面试宝典

    1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别? 答 ...

  2. MacOS(苹果电脑&苹果系统)连接京瓷300i 打印机

    前往京瓷官网下载打印机驱动: http://www.kyoceradocumentsolutions.com.cn/support/mfp/download/taskalfa300i.html 驱动安 ...

  3. if 的一切

    第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 如果条件为真(True),执行结果1,然后执行结果 ...

  4. nginx配置解析之客户端真实IP的传递

    前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取. 在一些特殊场景下,比如风控和支付流程,往往需要获 ...

  5. P1439 【模板】最长公共子序列

    题目描述 给出1-n的两个排列P1和P2,求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数n, 接下来两行,每行为n个数,为自然数1-n的一个排列. 输出格式: 一个数,即最长公共子 ...

  6. Plugin with id 'com.novoda.bintray-release' not found的解决方法

    我们一般在在github上下载下来的代码,有时候会提示Plugin with id ‘com.novoda.bintray-release’ not found的错误,这个怎么解决呢,其实很简单,只要 ...

  7. 学习笔记——并行编程Parallel

    Parallel 并行运算 参考资料:http://www.cnblogs.com/woxpp/p/3925094.html 1.并行运算 使用Parallel并行运算时,跟task很像,相当于tas ...

  8. Tarjan算法初探 (1):Tarjan如何求有向图的强连通分量

    在此大概讲一下初学Tarjan算法的领悟( QwQ) Tarjan算法 是图论的非常经典的算法 可以用来寻找有向图中的强连通分量 与此同时也可以通过寻找图中的强连通分量来进行缩点 首先给出强连通分量的 ...

  9. NRF52832初步使用

    开发环境搭建 开发环境涉及到协议栈SDK版本.keil PACK版本的匹配问题,目前测试通过的环境如下: windows系统:win10 硬件:NRF52832测试板.JLINK-V8仿真器 Keil ...

  10. sqli-labs学习(less-1-less-4)

    学习sqli-labs之前先介绍一些函数,以便于下面的payload看的懂 group_concat函数 将查询出来的多个结果连接成一个字符串结果,用于在一个回显显示多个结果 同理的还有 concat ...