python日记——网络爬虫之requests库
- 网络爬虫与信息提取流程图
- HTTP协议
1、HTTP,Hypertext Transfer Protocol,超文本传输协议,HTTP是一个基于“请求与响应”模式的、无状态的应用层协议,HTTP协议采用URL作为定位网络资源的标识,URL格式如下:http://host[:port][path]
host: 合法的Internet主机域名或IP地址
port: 端口号,缺省端口为80
path: 请求资源的路径
2、HTTP协议对资源的操作:
- Requests库入门
1、Requests库的七个主要方法:
requests.request(method, url, *kwargs) 方法是requests库其余六个方法的基础,它们都是通过requests.request()封装而成,因此,掌握requests.request()方法便可以掌握其余六种方法:
∙ method : 请求方式,对应get/put/post等7种
∙ url : 拟获取页面的url链接
∙ *kwargs: 控制访问的参数,共13个
(1)params : 字典或字节序列,作为参数增加到url中
(2)data : 字典、字节序列或文件对象,作为Request的内容
(3)json : JSON格式的数据,作为Request的内容
(4)headers : 字典,HTTP定制头
(5)cookies : 字典或CookieJar,Request中的cookie
(6)auth : 元组,支持HTTP认证功能
(7)files : 字典类型,传输文件
(8)timeout : 设定超时时间,秒为单位
(9)proxies : 字典类型,设定访问代理服务器,可以增加登录认证
(10)allow_redirects : True/False,默认为True,重定向开关
(11)stream : True/False,默认为True,获取内容立即下载开关
(12)verify : True/False,默认为True,认证SSL证书开关
(13)cert : 本地SSL证书路径
2、Requests库的2个重要对象:
Response对象的属性:
注意:
r.encoding:如果header中不存在charset,则认为编码为ISO‐8859‐1,r.text根据r.encoding显示网页内容;
r.apparent_encoding:根据网页内容分析出的编码方式,可以看作是r.encoding的备选。
3、爬取网页的通用代码框架:
网络连接有风险,异常处理很重要
(1)理解Requests库的异常:
r.raise_for_status()在方法内部判断r.status_code是否等于200,不需要
增加额外的if语句,该语句便于利用try‐except进行异常处理
(2)通用代码框架:
- 网络爬虫的“盗亦有道”
1、网络爬虫的尺寸:
2、网络爬虫引发的问题:
性能骚扰、法律风险、隐私泄露
3、网站如何限制网络爬虫:
(1)来源审查:判断User‐Agent进行限制
检查来访HTTP协议头的User‐Agent域,只响应浏览器或友好爬虫的访问
(2)发布公告:Robots协议
作用:网站告知网络爬虫哪些页面可以抓取,哪些不行
形式:在网站根目录下的robots.txt文件
- 爬虫案例:
1、入门案例
import requests as rq
url = 'https://www.baidu.com/'
try:
r = rq.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[0:500])
except:
print("发生异常!")
2、修改头部信息隐藏自身,防止被ban
kv = {'user-agent':'Mozilla/5.0'}
r = rq.get(url,header=kv)
3、根据url接口传入对应参数
百度的关键词接口:
http://www.baidu.com/s?wd=keyword
360的关键词接口:
http://www.so.com/s?q=keyword
kv = {'wd':'python'}
r = rq.get(url,params=kv)
4、图片抓取:
import requests as rq
import os
url = 'http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg'
path = 'D://Temp//abc.jpg'
try:
r = rq.get(url)
r.raise_for_status()
with open(path,'wb') as f:
f.write(r.content)#图片以二进制形式保存
f.close()
print("文件保存成功!")
except:
print("发生异常!")
本文部分内容参考于北京理工大学嵩天老师相关课程