第二章 网络爬虫之规则(Requests篇)
●Requests库入门
- 特点:简单、简洁,一行代码即可从网站上获取资源。
- 安装方法:CMD窗口->pip install requests
- Requests库的主要方法:1、requsets.request()方法
使用格式:requests. request(method, url, **kwargs)
-method:请求方式,对应HTTP协议GET PUT/POST等7种请求功能
-url:拟获取页面的url链接
-kwargs:控制访问的参数,共13个,均为可选项
**kwargs参数:
1)params:字典或字节序列,作为参数增加到url中,带入参数访问url;
>>> kv ={'key1':'valuel','key2':'value2'}
>>> r=requests.request('GET','http://python123.io/ws',params=kv)
>>> print(r.url)
https://python123.io/ws?key1=valuel&key2=value2
2)data:字典、字节序列或文件对象,作为 Request的内容,向服务器提供、提交资源时使用;
>>> kv ={'key1':'valuel','key2':'value2'}
>>> r=requests.request('POST','http://python123.io/ws',data=kv)
>>> body = '主题内容'
>>> r=requests.request('POST','http://python123.io/ws',data=body)
3)json:JSON格式的数据,作为Request的內容;
>>> kv ={'key1':'valuel','key2':'value2'}
>>> r=requests.request('POST','http://python123.io/ws',json=kv)
4)headers:字典,HTTP定制头,访问HTTP协议头;
>>> hd={'user-agent':'Chrome/10'}
>>> r=requests.request('POST','http://python123.io/ws',headers=hd)
5)cookies:字典或 CookieJar,Request中的 cookie;
6)auth:元组,支持HTTP认证功能;
7)files:字典类型,传输文件,向链接提交文件;
>>>fs={'file':open('data.xls','rb')}
>>> r=requests.request('POST','http://python123.io/ws',files=fs)
8)timeout:设定超时时间,秒为单位,时间内请求内容未反馈,生成timeout异常;
>>> r=requests.request('GET','http://python123.io/ws',time=10)
9)proxies:字典类型,设定访问代理服务器,可以增加登录认证,有效隐藏爬取网站原IP,防止逆追踪;
>>>pxs={'http':'http://user:pass@10.10.10.1:1234'
'https':'https://10.10.10.1:4321'}
>>> r=requests.request('GET','http://python123.io/ws',proxies=pxs)
10)allow_redirects:True/ False,默认为True,重定向开关;
11)stream:True/false,默认为True,获取内容立即下载开关;
12)verify:True/ False,默认为True,认证SSL证书开关;
13)cert:本地SSL证书路径。
2、requests.get()方法
使用格式:requests.get(url, params=None, **kwargs)
-url:拟获取页面的ur链接
-params:url中的额外参数,字典或字节流格式,可选
-kwargs:12个控制访问的参数,除params
实现原理:get(url)构造一个向服务器请求资源的Request对象,返回一个包含服务器资源的Response对象,即Response对象包含爬虫返回的内容。
Response对象属性:
r.apparent_encoding的编码比r.encoding更加准确。
‘utf-8’编码方式可解析中文,ISO-8859-1编码方式不可解析中文。
3、requests.head()方法
使用格式:requests.head(url, **kwargs)
-url:拟获取页面的ur链接
-kwargs:13个控制访问的参数
4、requests.post()方法
使用格式:requests.post(url, data=None,json=None,**kwargs)
-url:拟更新页面的ur链接
-data:字典、字节序列或文件, Request的内容
-json:JSON格式的数据, Request的内容
-kwargs:11个控制访问的参数,除data、json
5、requests.put()方法
使用格式:requests.put(url, data=None,**kwargs)
-url:拟更新页面的ur链接
-data:字典、字节序列或文件, Request的内容
-kwargs:12个控制访问的参数,除data
6、requests.patch()方法
使用格式:requests.patch(url, data=None,**kwargs)
-url:拟更新页面的ur链接
-data:字典、字节序列或文件, Request的内容
-kwargs:12个控制访问的参数,除data
7、requests.delete()方法
使用格式:requests.delete(url, **kwargs)
-url:拟删除页面的ur链接
-kwargs:13个控制访问的参数
- 爬取网页的通用代码框架:
1、Requests库的异常: 处理异常方法:r.raise_for_status() —如果不是200,产生异常 requests.HTTPError
2、爬取网页的通用代码框架: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协议:
1、HTTP, Hypertext Transfer Protocol,超文本传输协议。
2、HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。
-“请求与响应”模式:用户发送请求,服务器做相关响应
-无状态:第一次请求与第二次请求之间无关联
-应用层:该协议工作在TCP协议之上
3、HTTP协议采用URL作为定位网络资源的标识。
1) URL格式:http://host[:port][path]
-host:合法的Internet主机域名或IP地址
-port:端口号,缺省端口为80
-path:请求资源的路径
2)URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
4、HTTP协议对资源的操作:
1)PUT与PATCH区别:
采用PATCH,仅向URL提交局部数据更新请求,可节省网络带宽。
采用PUT,必须将所以数据一并提交到URL,未提交数据被删除。
2)HEAD方法用很少的网络流量,获取网络资源的概要信息。
3)POST方法向服务器提交新增数据,向URL POST一个字典、键值对自动编码为form(表单)。
●网络爬虫的盗亦有道
- 网络爬虫的尺寸
规模 特点 开发 应用范围 小规模 数据量小,爬取速度不敏感 Requests库 爬取网页,玩转网页 中规模 数据规模较大,爬取速度敏感 Scrapy库 爬取网页,爬取系列网站 大规模 搜索引擎,爬取速度关键 定制开发 爬取全网 - 爬虫引起的问题
1)网络爬虫的“骚扰”:受限于编写水平和目的,网络爬虫将会为web服务器带来巨大的资源开销;
2)网络爬虫的法律风险:服务器上的数据有产权归属,网络爬虫获取数据后牟利将带来法律风险;
3)网络爬虫泄露隐私:网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私。 - 网络爬虫的限制
1)来源审查:判断User-Agent进行限制
检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问。
2)发布公告: Robots协议
告知所有爬虫网站的爬取策略,要求爬虫遵守。
Robots协议(Robots exclusion standard网络爬虫排除标准):
作用:网站告知网络爬虫哪些页面可以抓取,哪些不行。
形式:在网站根目录下的 robots.txt文件。
基本语法: User-agent:*
Disallow:/
#注释,*代表所有,/代表根目录
使用:
网络爬虫:自动或人工识别 robots.txt,再进行內容爬取。
约束性: Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险。遵守建议如下:访问量很小:可以遵守;访问量较大:建议遵守 非商业且偶尔:建议遵守;商业利益:必须遵守 必须遵守 爬取网页,玩转网页 爬取网页,爬取系列网站 爬取全网
●Requests库网络爬虫实战
-
京东商品信息获取:
import requests url="https://item.jd.com/2967929.html" try: r = requests.get(url) r.raise_for_status() r.encoding=r.apparent_encoding print(r.text[: 1000]) except: print("爬取失败")
-
亚马逊商品信息获取(通过判断对网站访问的App头部headers,对网络爬虫限制):
import requests url="https://www.amazoncn/gp/product/bo1m8l5z3y" try: kv = {'user-agent':'Mozilla/5.0'} r = requests.get(url, headers=kv) r.raise_for_status() r.encoding = r.apparent_encoding print(r.text[1000: 2000]) except: print("爬取失败")
-
百度、360搜索关键词提交:
搜索引擎关键词提交接口,修改keyword向搜索引擎提交关键词
百度的关键词接口:
http://www.baidu.com/s?wd=keyword
360的关键词接囗:
http://www.so.com/s?q=keywordimport requests keyword ="Python" try: kv ={'wd': keyword} r = requests.get("http://www.baiducom/s",params=kv) print(r.request.url) r.raise_for_status() print (len(r.text)) except: print("爬取失败")
-
网络图片爬取:
网络图片链接的格式:http://www.example.com/picture.jpgimport requests import os url="https://up.enterdesk.com/edpic_360_360/5c/d8/1e/5cd81eca3361148bdf4a528964a4ff9f.jpg" path = "F:\\"+url.split('/')[-1] print(path) try: if not os.path.exists(path): r = requests.get(url) print(r) with open(path, 'wb')as f: f.write(r.content) print("文件保存成功") f.close() else: print("文件已存在") except: print("爬取失败")
-
IP地址归属地的自动查询:
python不具有查询IP地址归属地的功能库,通过网络资源实现。比如:http://m.ip138.com
import requests url="http://m.ip138.com/ip.asp?ip=" try: r = requests.get(url+'202.204.80.112') r.raise_for_status() r.ncoding =r.apparent_encoding print(r.text[-500:]) except: print("爬取失败")