python网络爬虫之二requests模块
requests http请求库
requests是基于python内置的urllib3来编写的,它比urllib更加方便,特别是在添加headers,
post请求,以及cookies的设置上,处理代理请求,用几句话就可以实现,而urllib比较繁琐,
requests比urllib方便多了,requests是一个简单易用的http请求库。 官方网站是:
简单实例:
import requests
response = requests.get("https://www.baidu.com/")
print(type(response))
print(response.status_code)
print(type(response.text))
print(response.text)
print(response.cookies) 这样我们就很方便的把请求的cookies获取出来了。 各种请求方式:
import requests
requests.get("http://httpbin.org/get")
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get") 一.基本的GET请求
1. 基本的http get请求:
import requests
response = requests.get("http://httpbin.org/get")
print(response.text)
我们可以通过response.text获取请求内容。 2. 带参数的get请求
import requests
response = requests.get("http://httpbin.org/get?name=germey&age=22")
print(response.text)
带参数请求:我们只需在链接地址后面加问好?然后后面带参数的名和值,参数和参数
之间用与&隔开。
另外requests函数也提供了一个params参数,可以代表用户向浏览器的请求,这样我们
就可以使用json字典的形式传递参数:
如:
格式如下:
response = requests.get(url,params=data) import requests
data = {
"name":"germey",
"age":22
}
response = requests.get("http://httpbin.org/get",params=data)
print(response.text) 3. 解析成json格式数据,这样方式在ajax请求的时候非常常用。
import requests
import json
response = requests.get("http://httpbin.org/get")
print(type(response)) #是一个class返回对象<class 'requests.models.Response'>
print(type(response.text)) #是一个字符串文本对象<class 'str'>
print(response.text) #是一个字符串文本
print(type(response.json())) #是一个json字典对象<class 'dict'>
print(response.json()) #是一个json字典文本,数据与下面相同
print(json.loads(response.text)) #是一个json字典文本,数据与上面相同
#而json.loads实际上是对返回的字符串对象进行一个json序列化操作,
#实际上json.loads(response.text)=response.json() 4. 获取二进制数据
是指下载文本数据,图片,视频时的下载对象,此时需要将文本,图片,视频等数据转换
成二进制数据,然后再将文本,图片,视频等数据保存到文件,此时我们就可以得到我们
想要的文本,图片和视频等数据了。
import requests
response = requests.get("https://avatars1.githubusercontent.com/u/29205487?s=40&v=4")
print(type(response.text)) #是一个字符串文本对象<class 'str'>
print(type(response.content)) #是一个bytes字节码对象<class 'bytes'>
print(response.text) #是一个string格式的乱码字符串
print(response.content) #是一个字节码的bytes字节流 #下载文本,图片,或者视频的方法:
import requests
response = requests.get("https://avatars1.githubusercontent.com/u/29205487?s=40&v=4")
with open("1.jpg","wb") as f:
f.write(response.content)
f.close()
#经过上面的验证,此时我们就可以根据以上方法获取文件,图片,或视频的的文件。此时我们需要
#将文件,图片,或视频链接地址传进去,然后将获取的文件,图片,或视频一字节流的形式写入到
#文件,此时我们打开文件,就可以获取到我们想要的文本,图片,或视频的的文件 #通过以上我们可以得出结论,如果获取字符串或者是二进制字节流信息,我们字节可以调用text或者
#content方法,但是如果我们想要获取json格式的字典数据,后面还得加一个括号,因为json不是原生
#自动转过来的,而是可以看成根据text文件二次转过来的。 5. 添加headers
添加headers是非常重要的,有时候我们在使用爬虫获取数据的时候,如果不添加headers,服务可能会
直接把我们禁掉,或者是服务器出出现请求或者回复错误等响应,我们以爬取知乎网站为例,如果我们
不添加headers,那么服务器会返回一个500状态码等一个这样的错误,如:
import requests
response = requests.get("https://www.zhihu.com/")
print(response.text)
此时会提示500错误。 添加浏览器的headers,其实就是伪装成一个浏览器。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
response = requests.get("https://www.zhihu.com/",headers=headers)
print(response.text) 关于headers内部的参数,我们可以从一个浏览器里面提取,在浏览器里面的请求参数中的:
user-agent字段,即代表了我们请求服务器所用的浏览器客户端信息,此时我们将他复制下来,
添加到headers字典中即可。 二.POST请求 1.基本的post请求:
post是将数据以form表单的形式传给服务器,此时我们需要以一个data数据字典的形式作为数据传递过去,
例如:
import requests
data = {"name":"germey","age":""}
response = requests.post("http://httpbin.org/post",data=data)
print(response.text) 2. post请求添加headers:
import requests
data = {"name":"germey","age":""}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
response = requests.post("http://httpbin.org/post",data=data,headers=headers)
print(response.text)
print(response.json()) 三.返回的response属性:
import requests
response = requests.get("http://www.baidu.com/")
print(type(response.status_code),response.status_code)
print(type(response.headers),response.headers)
print(type(response.cookies),response.cookies)
print(type(response.url),response.url)
print(type(response.history),response.history) response回复带有很多属性,常用的属性有:
1. 状态码: response.status_code int类型
2. headers:response.headers 字典类型
3. cookies: response.cookies cookies类型
4. url: response.url 这个url就是我们请求的url
5. history: response.history list元组类型,我们访问的历史记录 1. 状态码的判断,我们的浏览器都有一个状态码的分组,我们可以给根据这个状态码来进行一些
判断:
常见的有:
#请求成功的状态码:
100 状态码的名字
200 状态码的名字是ok
#redirect error:
300
#client error:
400
#server error:
500
另外每一个状态码都有一个自己的名字,我们也可以调用这个状态码的名字来进行判断,而不用记住
特定的状态码了,例如200的状态码是ok,此时我们就可以通过以下两种方式来验证判断。
第一种方式,通过状态码来进行验证:
即验证:if response.status_code == 状态码
import requests
response = requests.get("http://www.baidu.com/")
exit() if not response.status_code == 200 else print("Request Successfully")
此时打印:
Request Successfully
第一种方式,通过状态码的名字来进行验证:
即验证:if response.status_code == requests.codes.状态码的名字(即请求状态码的名字)。
import requests
response = requests.get("http://www.baidu.com/")
exit() if not response.status_code == requests.codes.ok else print("Request Successfully")
此时打印:if response.status_code == 状态码
Request Successfully 四.requests的其他的一些高级操作 1.文件上传
import requests
files = {'file':open("1.jpg","rb")} #在这指定上传后的文件名,我们也可以指定其他名字。
response = requests.post("http://httpbin.org/post",files=files)
print(response.text) 2.获取cookies
我们可以直接通过response.cookies这个属性,就可把cookies获取打印出来了,这个cookies实际上
是一个列表的形式,因此可以表示成这种形式:response.cookies.items(),这样我们就可以通过
for循环的形式把这些cookies打印出来,他们都是一个个key-value结构形式的数据。
import requests
response = requests.get("https://www.baidu.com/")
print(response.cookies)
for key,value in response.cookies.items():
print(key + 'n' + value) 3.会话维持
cookies是做会话维持的,有了这个cookies,我们就可以模拟一个用户一直维持在一个登陆状态,相当于
一个用户在一个浏览器里面一直维持登陆状态的操作。
import requests
requests.get("http://httpbin.org/cookies/set/number/123456789") #先为这个网站设置一个cookies
response = requests.get("http://httpbin.org/cookies") #然后我们就可以把当前的这个网站的cookies拿到
print(response.text)
此时我们打印:
{
"cookies": {}
}
#通过上面可以看到,我们获取的cookies是0,没有,其实根本原因也就是上面我们发起的两次请求
#分别是两个独立的过程,我们可以理解为,我们用一个浏览器设置了一个cookies,然后再用另外一个
#浏览器访问,也就是这个两个请求是独立的,此时我们需要模拟在一个浏览器里面操作,模拟一个set
#和get cookies的操作,此时就得用到如下方法。 requests提供了一个Session的对象,我们可以通过声明一个Session的对象,然后再用这个Session对象
发起两次get请求,那么这两次请求就相当于在一个浏览器里面操作了。
import requests
s = requests.Session()
s.get("http://httpbin.org/cookies/set/number/123456789")
response = s.get("http://httpbin.org/cookies")
print(response.text)
此时打印:
{
"cookies": {
"number": ""
}
}
#这个方法非常常用,假如我们再做模拟登录验证的时候,可以创建这么一个session对象,
#然后用这个session post一下用户名和密码,这样我们就相当于登录了,然后我们再用这个
#session对象进行操作,此时我们就会维持这么一个登录信息,我们就相当于再登录状态下操作
#了,此时我们就可以获取一些登录后的页面了,假如我们再做模拟登录的话,我么可以使用
#requests.Session这个对象来操作。 4.证书验证
现在的很多网站都是以https格式的网站了,假如入我们查看12306的网站,此时会提示一个ssl证书错误,
因为我们的爬虫程序没有ssl证书,因此在爬取数据或者与网站交互的时候会提示ssl错误。
此时,我们假如使用requests模块请求一个https网站的时候,可以使用两种方法来处理:
第一种方式:如果网站使用了不合法的证书,比如网站自己自己创建了以个证书,此时我们可以使用一个
参数verify=False来忽略这个证书,如果是合法的证书的话,也可以使用verif=False这个参数来忽略这个
证书,但是后面也会提示
例如:直接请求12306网站:
import requests
response = requests.get("https://www.12306.cn/")
print(response.status_code)
此时会提示ssl证书错误。 我们加一个参数verify=False访问,
import requests
response = requests.get("https://www.12306.cn/",verify=False)
print(response.status_code)
此时就可以正常访问操作了。
但是此时会打印信息如下:
C:\Program Files (x86)\Python\lib\site-packages\urllib3\connectionpool.py:858:
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification
is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
200 从上面信息我们可以看到,虽然我们将证书验证设置为False之后,但是在输出结果还是会提示一个警告warnings
的信息,提示最好加一个证书,此时我们通过requests模块导入一个叫做urllib3的原生的包,然后通过调用这个
urllib3的一个disable_warning方法来消除这些警告信息,如from requests import urllib3,经过测试,我们也
可以直接导入这个urllib3的包。
如下所示:
import requests
import urllib3
urllib3.disable_warnings()
response = requests.get("https://www.12306.cn/",verify=False)
print(response.status_code) 第二种方式.我们可以手动使用cert参数指定一个证书的验证,此时需要添加一个cert参数,此时我们的请求就会
自动的通过这个CA证书进行验证了,如下所示:
import requests
response = requests.get("https://www.12306.con/",cert=("/path/server.crt","/path/key"))
print(response.status_code) 5.代理设置
第一种方式:http代理
我们只需设置一个proxies代理的字典,然后将这个代理传过去既可以了。
import requests
proxies = {
"http":"http://127.0.0.1:10010",
"https":"https://127.0.0.1:10011",
}
response = requests.get("https://www.taobao.com/",proxies=proxies)
print(response.status_code)
此时我们就可以使用我们的代理来访问网站了。
假如我们的代理需要用户名和密码,此时我们可以在代理前面添加一个用户名和密码,然后加一个
'@'符,此时我们就可以访问了,如下所示:
import requests
proxies = {
"http":"http://user:password@127.0.0.1:10010",
}
response = requests.get("https://www.taobao.com/",proxies=proxies)
print(response.status_code) 第二种方式:使用socks代理:
此时我们需要安装一个requests[socks]模块
pip install requests[socks]
import requests
proxies = {
"http":"socks5://127.0.0.1:10010",
"https":"socks5://127.0.0.1:10011",
}
response = requests.get("https://www.taobao.com/",proxies=proxies)
print(response.status_code)
此时我们就可以通过socks代理来进行访问了。 6.超时的设置:
超时的设置,实际上就是设置一个timeout,假如我们在请求一个网站时,限制一个超时时间的设置,
此时我们可以设置一个timeout的参数。
如下:
import requests
response = requests.get("https://www.taobao.com/",timeout=1)
print(response.status_code)
此时能正常访问。
如果我们设置个一个较短的时间,比如0.001秒,那么他就会抛出一个
import requests
response = requests.get("https://www.taobao.com/",timeout=0.001)
print(response.status_code)
此时就会出现浏览器访问超时错误,提示抛出一个如下的ReadTimeout的异常:
#requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.taobao.com', port=443):
#Read timed out. (read timeout=0.01)
import requests
from requests.exceptions import ReadTimeout
try:
response = requests.get("https://www.taobao.com/",timeout=0.01)
print(response.status_code)
except ReadTimeout:
print("timeout")
此时就会输出一个:
#timeout 7.认证设置
有的网站访问的时候需要输入一个用户名和密码才能登录访问,登录以后我们才能看到网站页面里
的内容,假如我们遇到这样一个需要登录验证的网站,requests模块提供了一个auth参数,我们就
可以通过这个auth传入一个HTTPBasicAuth参数把用户名和密码传过来,这样的话我们就可以正常
登录进去完成一个正常的请求。
假如我们不传入用户名和密码,直接请求:
import requests
response = requests.get("http://www.11111.com")
print(response.status_code)
此时就会返回请求被禁止的401状态码:
输入如下:
#
此时我们可以使用auth将我们的用户名和密码传过去:
第一种方法,直接传入一个字典:
import requests
response = requests.get("http://www.11111.com",auth=('username','password'))
print(response.status_code) 第二种方法,通过HTTPBasicAuth传入一个字典,这两种方式都可以。
import requests
from requests.auth import HTTPBasicAuth
response = requests.get("http://www.11111.com",auth=HTTPBasicAuth('username','password'))
print(response.status_code) 此时就可以正常访问了。 8.关于异常处理的部分
import requests
from requests.exceptions import ReadTimeout,HTTPError,ConnectionError,
python网络爬虫之二requests模块的更多相关文章
- 【python网络爬虫】之requests相关模块
python网络爬虫的学习第一步 [python网络爬虫]之0 爬虫与反扒 [python网络爬虫]之一 简单介绍 [python网络爬虫]之二 python uillib库 [python网络爬虫] ...
- python 网络爬虫(二)
一.编写第一个网络爬虫 为了抓取网站,我们需要下载含有感兴趣的网页,该过程一般被称为爬取(crawling).爬取一个网站有多种方法,而选择哪种方法更加合适,则取决于目标网站的结构. 首先探讨如何安全 ...
- python 网络爬虫(二) BFS不断抓URL并放到文件中
上一篇的python 网络爬虫(一) 简单demo 还不能叫爬虫,只能说基础吧,因为它没有自动化抓链接的功能. 本篇追加如下功能: [1]广度优先搜索不断抓URL,直到队列为空 [2]把所有的URL写 ...
- python网络爬虫(二)requests库的基本介绍和使用
一.requests库的七个重要方法 (1)最常用方法:requests.get(url,params=None,**kwargs)//对应HTTP协议的GET()操作 (请求获得URL位置的资源) ...
- python网络爬虫之三re正则表达式模块
""" re正则表达式,正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的 一些特定字符,及这些特定字符的组合,组成一个"规则字符串",然后用 ...
- Python网络爬虫实战(二)数据解析
上一篇说完了如何爬取一个网页,以及爬取中可能遇到的几个问题.那么接下来我们就需要对已经爬取下来的网页进行解析,从中提取出我们想要的数据. 根据爬取下来的数据,我们需要写不同的解析方式,最常见的一般都是 ...
- [Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容
版本号:Python2.7.5,Python3改动较大. 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的 ...
- python网络爬虫之入门[一]
目录 前言 一.探讨什么是python网络爬虫? 二.一个针对于网络传输的抓包工具fiddler 三.学习request模块来爬取第一个网页 * 扩展内容(爬取top250的网页) 后记 @(目录) ...
- Python网络爬虫
http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...
随机推荐
- Java时间戳转化为今天、昨天、明天(字符串格式)
原文:http://www.open-open.com/code/view/1435301895825 时间戳,相信大家一定都不陌生,服务器经常会传回来时间戳,需要我们对时间戳进行处理.各种麻烦不断, ...
- 代理服务器squid简介
Squid 是一个高性能.开源的代理缓存服务器和 Web 缓存进程,支持 FTP.Internet Gopher.HTTPS 和 SSL 等多种协议.它通过一个非阻塞的.I/O 事件驱动的单一进程处理 ...
- 【转】apache storm 内置的定时机制
原文:http://www.cnblogs.com/kqdongnanf/p/4778672.html ------------------------------------------------ ...
- Android中的图片查看器
本案例,使用Eclipse来开发Android2.1版本号的图片查看器. 1)首先,打开Eclipse.新建一个Android2.1版本号的项目ShowTu,打开res/values中文件夹下的str ...
- LightOj 1027 A Dangerous Maze【概率】
题目链接:http://www.lightoj.com/volume_showproblem.php? problem=1027 题意: 你面前有n个门,每一个相应一个数字,若为正xi.代表xi分钟后 ...
- Redis5.0之Stream案例应用解读
非常高兴有机会和大家在这里交流Redis5.0之Stream应用.今天的分享更多的是一个抛砖引玉,欢迎大家提出更多关于Redis的思考. 首先,我们来个假设,这里有个杯子,这个杯子是去年我老婆送的,送 ...
- hdu1133 Buy the Ticket (卡兰特数应用+java大数)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1133 [题意] 电影票50块一张 有m个人手里正好有50块,n个人手里正好有100块,售票厅開始没有 ...
- Redhat enterpise6 安装unix2dos/dos2unix
初用unix2dos,在rhel6 上 用yum install unix2dos , 提示源不可用, 那好吧, 就去rpm包网:http://rpm.pbone.net/ 下载了一个unix2dos ...
- Oracle修改序列(Sequence)起始值问题
Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改 ...
- UVA10600 ACM Contest and Blackout —— 次小生成树
题目链接:https://vjudge.net/problem/UVA-10600 In order to prepare the “The First National ACM School Con ...