单元一:Request库入门
Request库的get()方法
r=requests.get(url);
-
构造一个向服务器请求资源的Request对象
-
get()方法返回一个包含服务器资源的Response对象(即r使一个Response对象)
-
Response对象包含从服务器返回的所有资源(爬虫返回的全部内容)
-
get()函数完整使用方法:request.get(url,params=None,**kwargs)
url:拟获取页面的URL链接
params:URL中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数,可选
Response对象
>>> import requests
>>> r=requests.get("http://www.baidu.com")
>>> print(r.status_code) # 检测状态码:200->成功;404->失败
>>> type(r) # 检测r的类型
>>> r.headers # 返回get请求获得页面的头部信息
-
Response对象包含服务器返回的所有信息和向服务器请求的Request的信息
-
属性
① r.status_code:HTTP请求的返回状态
② r.text:HTTP响应内容的字符串形式,即URL对应的页面内容
③ r.encoding:从HTTP header中猜测的响应内容编码方式(header中的charset),如果header中不存在charset,则认为编码为ISO-8859-1
④ r.apparent_encoding:从网页内容中分析出的响应内容编码方式(备选编码方式)
⑤ r.content:HTTP响应内容的二进制形式
爬取网页的通用代码框架
-
Requests库的异常
① requests.ConnectionError:网络连接错误,如DNS查询失败、拒绝连接等
② requests.HTTPError:HTTP错误异常
③ requests.URLReqired:URL缺失异常
④ requests.TooManyRedirects:超过最大重定向次数,产生重定向异常
⑤ requests.ConnectTimeout:连接远程服务器超时异常(连接过程产生的异常)
⑥ requests.Timeout:请求URL超时,产生超时异常(发出请求到获得内容整个过程的超时异常) -
Response类提供的关于异常的方法
r.raise_for_status():如果不是200,产生异常requests.HTTPError
import requests
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status() # 若状态不是200,引发HTTPError异常
r.encoding=r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__=="__main__":
url="http://www.baidu.com"
print(getHTMLText(url))
HTTP协议及Requests库方法
-
Requests库的7个主要方法
① requests.requests():构造一个请求,支撑以下个方法的基础方法
② requests.get():获取HTML网页的主要方法,对应于HTTP的GET
③ requests.head():获取HTML网页头信息的方法,对应于HTTP的HEAD
④ requests.post():向HTML网页提交POST请求的方法,对应于HTTP的POST
⑤ requests.put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT
⑥ requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
⑦ requests.delete():向HTML页面提交删除请求,对应于HTTP的DELETE -
URL
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
格式:http://host[:port] [path]
host:合法的Internet主机域名或IP地址
port:端口号,可省略,缺省端口为80
path:请求资源的路径 -
HTTP协议(超文本传输协议):是一个基于“请求与相应”模式的、无状态(第一次和第二次请求之间没有关联)的应用层协议。采用URL作为定位网络资源的标识
-
HTTP协议对资源的操作(每一次操作都是独立无状态的)
① GET:请求获取URL位置的资源(全部资源)
② HEAD:请求获取URL位置资源的响应消息报告,即获得该资源的头部信息(资源太大)
③ POST:请求URL位置的资源后附加新的数据
④ 当我们向URLpost了一个字典/键值对的时候,键值对会默认存储到表单等字段下.向URLpost一个字符串,字符串自动编码为data
⑤ PUT:请求向URL位置存储一个资源,覆盖原URL位置的资源
⑥ PATCH:请求局部更新URL位置的资源,即改变该处资源的部分内容(与PUT比较,节省网络带宽)
⑦ DELETE:请求删除URL位置存储的资源
>>> payload={"key1":"value1","key2":"value2"}
>>> r=requests.post("http://httpbin.org/post",data=payload)
>>> print(r.text)
Requests库主要方法解析
- requests.request(method,url,**kwargs)
- method:请求方式,对应get/put/post/options(从服务器获取服务器与客户端打交道的参数)等7种
- URL:拟获取页面的url连接
- **kwargs:控制访问的参数,共13个(均为可选项)
1)params:字典或字节序列,作为参数增加到URL中
2)data:字典、字节序列或文件对象,作为Request的内容
3)json:JSON格式的数据,作为Request的内容
4)headers:字典,HTTP定制头(可用来定制访问URL的HTTP的协议头、模拟浏览器)
5)cookies:字典或CookieJar,Request中的cookie(从HTTP协议中解析cookie)
6)auth:元祖,支持HTTP认证功能
7)files:字典类型,向服务器传输文件
8)timeout:设定超时时间,秒为单位
9)Proxies:字典类型,设定访问代理服务器,可以增加登录认证(访问服务器是的IP地址就是代理服务器的IP地址,有效隐藏用户爬起网页的原IP地址)
10)allow_redirects:True/False,默认为True,重定向开关
11)stream:True/False,默认为True,获取内容立即下载开关
12)verify:True/False,默认为True,认证SSL证书开关
13)cert:本地SSL证书路径
>>> kv={"key1":"value1","key2":"value2"}
>>> r=requests.request('GET','http://python123.io/ws',params=kv)
>>> print(r.url)
http://python123.io/ws?key1=value1&key2=value2
>>> kv={"key1":"value1","key2":"value2"}
>>> r=requests.request('POST','http://python123.io/ws',data=kv)
>>> body='主题内容'
>>> r=requests.request('POST','http://python123.io/ws',data=body)
>>> kv={"key1":"value1"}
>>> r=requests.request('POST','http://python123.io/ws',json=kv)
>>> hd={'user-agent':'Chrome/10'}
>>> r=requests.request('POST','http://python123.io/ws',headers=hd)
>>> fs={'file':open('data.xls','rb')}
>>> r=requests.request('POST','http://python123.io/ws',files=fs)
>>> pxs={'http':'http://user:pass@10.10.10.1:1234'
'https':'http://10.10.10.1:4321'}
>>> r=requests.request('GET','http://www.baidu.com',proxies=pxs)
-
requests.get(url,params-None,**kwargs)
url:拟获取页面的URL链接
params:URL中的额外参数,字典或字节流格式,可选
**kwags:12个控制访问的参数 -
requests.head(url,**kwags)
url:拟获取页面的URL链接
**kwags:13个控制访问的参数 -
requests.post(url,data=None,json=None,**kwags)
url:拟更新页面的URL链接
data:字典、字节序列或文件,Request的内容
json:JSON格式的数据,作为Request的内容
**kwags:11个控制访问的参数 -
requests.put(url,data=None,**kwags)
url:拟更新页面的URL链接
data:字典、字节序列或文件,Request的内容
**kwags:12个控制访问的参数 -
requests.patch(url,data=None,**kwags)
url:拟更新页面的URL链接
data:字典、字节序列或文件,Request的内容
**kwags:12个控制访问的参数 -
requests.delete(url,**kwags)
URL:拟删除页面的URL链接
**kwags:12个控制访问的参数
· 爬取网页框架
try:
r=requests.get(url,timeout=30)
r.raise_for_status() #若状态码不是200,产生异常
r,encoding=r.apparent_encoding
return r.text
except:
return "产生异常"
单元二:网络爬虫的“盗亦有道”
网络爬虫引发的问题
- 网络爬虫的尺寸
小规模,数据量小;爬取速度不敏感;Requests库 | 中规模,数据规模较大;爬取速度敏感;Scrapy库 | 大规模,搜索引擎;爬取速度关键;定制开发 |
---|---|---|
爬取网页,玩转网页 | 爬取网站,爬取系列网站 | 爬取全网 |
- 网络爬虫的限制
来源审查:判断User-Agent进行限制(技术能力要求)
检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问
发布公告:Robots协议(告知所有爬虫网站的爬取策略,要求爬虫遵守)
Robots协议(网络爬虫排除标准)
-
作用:网站告知网络爬虫哪些页面可以抓取,哪些不行
-
形式:在网站的根目录下的robots.txt文件
实例
-
百度的关键词接口:http://www.baidu.com/s?wd=keyword
360的关键词接口:http://www.so.com/s?q=keyword
实例代码链接:
https://blog.csdn.net/qq_44838702/article/details/104984489