网络爬虫规则
[TOC]
1. request库入门
request库的安装
win平台下,运行cmd,输入命令
pip install requests
request库的7个主要方法
方法 | 含义 |
---|---|
requests.request() | 构造一个请求 |
request.get() | 获取html网页的内容 |
request.head() | 获取html网页头信息的方法 |
request.post() | 向html页面提交post请求 |
request.put() | 向html页面提交put请求 |
request.patch() | 向html页面提交局部的修改请求 |
request.delete() | 向html页面提交删除请求 |
注:其中,request方法是下面6个方法的基础方法,其余6个方法都是在request方法基础上实现的,由于一般服务器都有保护防止攻击,所以put、patch、delete方法一般不使用,常用的方法为get head post方法,有关patch和put方法之间的区别下面有说。
HTTP协议
HTTP协议,也称为超文本传输协议,Hypertext transfer protocol
HTTP是一个基于 请求与响应 模式的、无状态的应用层协议,HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
http:/ /host[:port][path]
host:合法的主机域名或ip地址
port:端口号,默认为80
path:请求资源的路径
举个例子,这是死侍2的百度网盘地址https://pan.baidu.com/s/14LYNSuRFqui6xySLtbIU3g#list/path=%2F
其中,pan.baidu.com/
是百度网盘的主机域名,s/14LYNSuRFqui6xySLtbIU3g#list/path=%2F
是资源的路径
对于HTTP URL,可以理解为一个存在与INTERNET的文件路径通过URL和HTTP协议,存取资源,一个URL对应的是一个数据资源
HTTP协议中对资源的操作有7种方法,分别为
- GET
请求获取URL位置的资源 - HEAD
请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 - POST
请求向URL位置的资源后附加新的数据,比如post表单之类 - PUT
请求向URL位置存储一个资源,覆盖原资源 - PATCH
请求局部更新URL位置的资源,改变部分内容 - DELETE
请求删除URL位置资源
注:这里要理解PATCH
和PUT
的区别,patch仅仅是修改局部数据而且是由提交的内容来修改,put是将修改内容作为新的内容覆盖掉url地址的全部内容,path的优势在于,节省网络带宽
注意到requests库和HTTP协议的操作方式是相同的,功能也是一致的
Requests库方法详解
requests库的两个重要对象
r = requests.get(url)
r为Response
对象,包含服务器返回的内容资源,get中包含的是Request
对象,是由函数构建的发送给网页的对象,Response
对象包含服务器返回的所有信息,也包含请求的request信息
Response对象有下列属性
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200成功,其余表示失败 |
r.text | HTTP响应内容的字符串形式,url对应的页面内容 |
r.encoding | 从HTTP header中猜测编码方式 |
r.apparent_encoding | 从内容中分析出响应内容的编码方式 |
r.content | HTTP响应内容的二进制形式 |
注:如果header中不存在charset
字段,则认为编码为ISO-8859-1
Response对象存在一种异常处理方法,为
r.raise_for_status()
如果r.status_code不等于200,则引发异常,可以使用try-except捕捉
7个方法介绍
-
get() 方法
get方法的格式为
requests.get(url,params=None, **kw)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
********kw**:12个控制访问参数
get方法会返回response对象r,性质上述以写
-
head() 方法
requests.head(url, **kw)
返回网页HTML头的内容
url:链接
****** kw:控制参数
-
post() 方法
payload = {'k1':'v1','k2':'v2'} r = requests.post(url, data = payload)
将字典POST后,自动编码为form
r = requests.post(url, data = 'ABC')
将字符串POST后,自动编码为data,而form为空
格式为
requests.post(url, data=None, json=None, **kw)
url:链接
data:字典、字节序列或文件
json:JSON格式数据
********kw**:控制参数
-
put() 方法
用法同post
格式为
requests.put(url, data=None, **kw)
-
patch() 方法
requests.patch(url, data=None, **kw)
-
delete() 方法
requests.delete(url, **kw)
-
request() 方法
request方法内存在参数method,几乎可以替代所有其他的方法
requests.request(method, url, **kw)
method:请求方式,对应get/post等等
url:链接
********kw**:控制参数
具体的请求方式为:GET、HEAD、POST、PATCH、PUT、delete、OPTIONS
控制访问参数
一共有12个控制访问参数:
params:字典或字节序列,作为参数增加到url中
kv = {key:value}
r = requests.get(url, params=kv)
=> url?key=value&key=value
data:字典、字节序列或文件对象,作为request的内容
kv = {key:value}
r = requests.post(url, data=kv)
body = '主题内容'
r = requests.post(url, data=body)
json:JSON格式的数据,作为request的内容
kv = {key:value}
r = requests.post(url, json=kv)
headers:字典,HTTP定制头,可以修改HTTP头中的内容,也就是说,可以修改头中特定字段的内容,比如用户代理user-agent
hd = {'user-agent':'Chrome\10'}
r = requests.post(url, headers = hd) #修改user-agent字段
以及
cookies:字典或cookiejar,request中的cookie
auth:元组,支持HTTP认证功能
files:字典类型,传输文件
fs = {'file':open('data.xls','rb')}
r = requests.post(url, files = fs)
还不知道怎么用
timeout:设定超时时间,秒为单位,可以用在get方法防止请求时间过长
r = requsets.get(url, timeout = 10)
proxies:字典类型,设定访问代理服务器,可以增加登陆认证
pxs = {'http':'http://user:pass@10.10.10.1:1234'
'https':'https://10.10.10.1:4321' }
r = requests.get(url, proxies = pxs)
allow_redirects:True/False 默认为True,重定向开关
strea:布尔,默认为True,获取内容立即下载开关
verify:布尔,默认为True,认证SSL证书开关
cert:本地SSL证书路径
2. 网络爬虫盗亦有道
网络爬虫的尺寸
分为大中小三种尺寸
小规模 | 中规模 | 大规模 |
---|---|---|
爬取速度不敏感,使用Request库 | 数据规模较大,对于爬取速度敏感,使用Scrapy库 | 爬取速度是关键,定制开发 |
网络爬虫引发问题
- 性能骚扰
- 法律风险
- 隐私泄露
网络爬虫的限制方法
来源审查
网站服务器会通过检查来访HTTP协议的user-agent域,只响应浏览器或友好爬虫,比如淘宝= =
发布公告
通过网站的robots协议,告知所有爬虫爬取策略,要求遵守,robots协议存放在网站域名的根域名下robots.txt
文件,比如京东的
https://wwww.jd.com/robots.txt
内容为
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
User-agent: EtaoSpider
Disallow: /
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
# * 代表所有, / 代表根目录
# 例如淘宝为
# User-agent: *
# Disallow: /
Robots协议如果不遵守,有法律风险,但如果爬虫的访问频率类似于人的话,不必遵守
网友评论