网络爬虫(Web crawler)
网络爬虫又称为爬虫,是一种系统地浏览万维网的互联网机器人,通常由搜索引擎操作用于建立网页索引。又被称为网络蜘蛛,是由于互联网是由无数个服务器自主运行充当网络节点,而通过网络协议将其链接的一个网络,爬虫在搜索查找的过程就像是蜘蛛在不同节点走动,故称为网网络蜘蛛。针对小规模的网页爬虫可以使用Requests库,对于网站等中规模爬虫对爬取速度敏感需要用Scrapy库,而全网爬取是用于构建搜索引擎索引则需要定制开发。
HTTP协议(超文本传输协议)
超文本传输协议用于规范万维网上服务器与浏览器间信息传递的一种协议(请求-响应协议),以TCP传输层协议为基础是一种应用层协议。
具体内容看图解HTTP 了解Web及网络基础
Requests框架
Requests框架是一个通用简便的爬虫框架,对urllib3进行了高层封装让你更便捷地发出HTTP请求,号称是“为人类准备的HTTP库”。Requests官网
requests库有7个主要方法,但本质上只有一个主要方法request(),其他的方法都是出于使用方便考虑依照HTTP协议的6大方式封装出来的(函数内部就是在方法request()中通过第一个参数指定方式)。
在这6个方法中需要重点掌握get(),该方法构造一个向服务器请求资源的Requests对象,提交后返回包含服务器资源的Response对象(该对象包含服务器返回的所有信息,包括Request的请求信息)。以下是Response对象的属性:
其中的content属性说是二进制形式的内容是指图像、音频等文件
爬取网页的通用代码框架
import requests
try:
r = requests.get("http://www.baidu.com", timeout=30)
r.raise_for_status() # 返回值不是200的话会引发HTTPError
print(r.encoding)
print(r.apparent_encoding)
r.encoding = r.apparent_encoding # 将从内容猜测出来的文本编码方式作为此文档的编码方式
print(r.text[:10])
except:
print("异常")
网络爬虫合法指南
网络爬虫的风险
- 性能骚扰:web服务器是面向人类访问开发,而爬虫利用计算机模拟访问机制向服务器发送了大量的请求,可能对服务器带来巨大的资源消耗
- 法律分险:服务器的数据具有产权归属,爬取的数据用于牟利将可能带来法律分险
- 网络爬虫可能具备突破简单访问控制的能力,获得被保护资源而泄露个人隐私
网络爬虫的限制及规范
- 来源审查:在请求头部中包含了用户代理信息(代理人类需求发起请求的代理器),检查HTTP协议头的User-Agent域,只响应浏览器和友好爬虫的访问(技术限制)
- 协议公告:在网站根目录下发布Robots协议,告知服务器上网站对应被爬取的限制,要求爬虫遵守(非技术强制但不遵守可能会有法律分险)
当你的爬虫访问频次低数据量小类似人类访问行为时可以不参考robots协议
当你带着友好爬虫的心态遇到了来源审查时,我们可以手动修改HTTP头中的User-Agent域为Mozilla/5.0(浏览器默认)
import requests
url = "https://www.amazon.cn/dp/B0895R6GDK"
kv = {"user-agent":"Mozilla/5.0"}
try:
r = requests.get(url,headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:100])
except:
print("有问题")