Python爬虫系列之requests模块
之前用php的时候也爬取过别人网站的数据,那时候采集数据,感觉自从python火起来之后就变为爬虫了,甚至让人觉得一说到爬虫代指的就是python了,不过想想来看使用python制作爬虫比当年使用php采集简直容易简单的太多了,php那时候只能自个写正则进行繁琐的匹配,python不光可以使用正则,第三方库使用xpath和BeautifulSoup进行目标解析让我不用正则就能轻松爬取到想要的数据,一个字“太爽了”!!!
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
Requests简介
requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
requests与urllib模块对比
urllib | requests |
|---|---|
手动处理url编码 | 自动处理url编码 |
| 手动处理post请求参数 | 自动处理post请求参数 |
| 处理cookie和代理操作繁琐 | 简化cookie和代理操作 |
安装
1 | pip install requests |
主要方法
| 方法 | 解释 |
|---|---|
requests.request() | 构造一个请求,支持以下各种方法 |
requests.get() | 获取html的主要方法 |
requests.head() | 获取html头部信息的主要方法 |
requests.post() | 向html网页提交post请求的方法 |
requests.put() | 向html网页提交put请求的方法 |
requests.patch() | 向html提交局部修改的请求 |
requests.delete() | 向html提交删除请求 |
requests.get()
语法:
1 | r=requests.get(url,params,**kwargs) |
url
要请求的目标地址
params
字典或字节序列, 作为参数增加到url中,使用这个参数可以把一些键值对以?key1=value1&key2=value2的模式增加到url中
**kwargs
例如:
1 | kv = {'key1':' values', 'key2': 'values'} |
data:字典,字节序或文件对象,重点作为向服务器提供或提交资源是提交,,作为request的内容,与params不同的是,data提交的数据并不放在url链接里, 而是放在url链接对应位置的地方作为数据来存储。,它也可以接受一个字符串对象。json:json格式的数据,json合适在相关的html,http相关的web开发中非常常见, 也是http最经常使用的数据格式, 他是作为内容部分可以向服务器提交。例如:
1
2kv = {'key1': 'value1'}
r = requests.post('http://python123.io/ws', json=kv)headers:字典是http的相关语,对应了向某个url访问时所发起的~的头i字段, 可以用这个字段来定义http的访问的http头,可以用来模拟任何我们想模拟的浏览器来对url发起访问。例子:
1
2hd = {'user-agent': 'Chrome/10'}
r = requests.post('http://python123.io/ws', headers=hd)cookies:字典或CookieJar,指的是从http中解析cookieauth:元组,用来支持http认证功能files:字典, 是用来向服务器传输文件时使用的字段。例子:
1
2fs = {'files': open('data.txt', 'rb')}
r = requests.post('http://python123.io/ws', files=fs)timeout: 用于设定超时时间, 单位为秒,当发起一个get请求时可以设置一个timeout时间, 如果在timeout时间内请求内容没有返回, 将产生一个timeout的异常。proxies:字典, 用来设置访问代理服务器。allow_redirects: 开关, 表示是否允许对url进行重定向, 默认为True。stream: 开关, 指是否对获取内容进行立即下载, 默认为True。verify:开关, 用于认证SSL证书, 默认为True。cert: 用于设置保存本地SSL证书路径
响应数据
| 属性 | 说明 |
|---|---|
r.status_code | http请求的返回状态,若为200则表示请求成功。 |
r.text | http响应内容的字符串形式,即返回的页面内容 |
r.encoding | 从http header 中猜测的相应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | http响应内容的二进制形式 |
举例
1 |
|
request库异常
注意requests库有时会产生异常,比如网络连接错误、http错误异常、重定向异常、请求url超时异常等等。所以我们需要判断r.status_codes是否是200,在这里我们怎么样去捕捉异常呢?
这里我们可以利用r.raise_for_status() 语句去捕捉异常,该语句在方法内部判断r.status_code是否等于200,如果不等于,则抛出异常。
于是在这里我们有一个爬取网页的通用代码框架:
1 | try: |
request.head()
1 | r=requests.head("http://httpbin.org/get") |
requests.post()
post一个字典
1 | payload={"key1":"value1","key2":"value2"} |
post字符串
自动编码为data
1 | r=requests.post("URL地址",data='helloworld') |
post一个文件
1 | import requests |
put和patch与post类似,故不再做示例。
requests代理
- 什么是代理
- 代理就是第三方代替本体处理相关事务。例如:生活中的代理:代购,中介,微商……
- 爬虫中为什么需要使用代理
- 一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个
IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。
- 一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个
- 代理的分类:
- 正向代理:代理客户端获取数据。正向代理是为了保护客户端防止被追究责任。
- 反向代理:代理服务器提供数据。反向代理是为了保护服务器或负责负载均衡。
- 免费代理
ip提供网站- http://www.goubanjia.com/
- 西祠代理
- 快代理
百度IP,测试是否代理ip成功
1 | import requests |
会话维持
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 简单的说,如果你要爬取的页面是登录后才能查看的网页,那么就要像浏览器访问一样,保持其登录状态,者就用到了session
登录人人网
登录人人网,如果有验证码要识别其验证码,登录后下载其个人主页页面。在这里着重说下验证码吧,很多网站登录都需要验证码,人人网也一样,可能是在你多次输入账号密码错误的时候才会让你填写验证码。关于识别验证码我们这里使用到了第三方的API,云打码,市面上有很多类似的产品,大概原理就是访问登录页面时,将页面上的验证码下载下来,使用第三方api识别然后进行登录,具体的第三方都会提供文档和示例代码,这里就不详细解释。
识别验证码文件
CodeDemo.py
1 | import http.client, mimetypes, urllib, json, time, requests |
上述代码不用理解其意思,就是第三方给我们提供的示例,拿来可以直接使用
主代码
1 | import requests |
登录古诗文网
我们依然要用到识别验证码,上述代码中的识别验证码部分这里就不上了,直接主体部分
1 | import requests |
多线程
我们这里使用多线程爬取视频。
1 | import requests, re, time |
这里
爬取搜狗
请求载体身份标识的伪装:
User-Agent:请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。- 反爬机制:某些门户网站会对访问该网站的请求中的
User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。 - 反反爬策略:将爬虫程序的
UA伪装成某一款浏览器的身份标识。
1 | import requests |
豆瓣电影排行榜
1 | import requests |
豆瓣登录数据
1 | import requests |
药监局
1 | import requests |