爬虫基本原理
爬虫基本原理
概述:网络爬虫(web spider) 又称为网络蜘蛛、网络机器人,是一种按一定规则,自动抓取万维网信息的程序或脚本。
按系统结构和实现技术进行分类
- 通用网络爬虫:尽可能大的网络覆盖率,如百度,谷歌搜索;
- 聚焦网络爬虫:有目标性,选择性访问万维网爬取信息(适用开发人员);
- 增量式网络爬虫:只爬取新产生或已经更新的网页信息(比如爬新闻信息,每天只需要爬取更新的信息,之前的老信息就不爬取了)。特点:耗费少,难度大;
- 深层网络爬虫:通过提交一些关键字才能获取的Web页面, 如登录或注册后访问的页面;
注意:在实际应用中通常是以上几种爬虫技术的结合实现。
爬虫应用场景
- 科学研究:在市场上通过爬虫获取大量数据,获取我们所需要的信息,进行科学研究;
- Web安全:通过爬虫实现漏洞检测功能(比如检测死链接等);
- 产品研发:通过获取的数据,进行分析,进行市场研究,可以更好的研发新产品;
- 舆情监控:分析识别如微博数据中某些用户是否是水军。
网络爬虫的合法性
- 在很多网站根路径下会有个robots.txt文档,如果没有这个文档,那么网站所有数据都可以爬取;
- 在有robots.txt文档的网站下,需要判断是否有禁止访客获取数据;
- 文档举例: https://www.taobao.com/robots.txt 可以查看淘宝网站里面的具体规则。
爬虫基本流程
- 发起请求 : 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应;
- 获取响应内容: 如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML,Json字符串,二进制数据(如图片视频)等类型;
- 解析内容: 得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是Json,可以直接转为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理;
- 保存数据: 保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式的文件;
- 可视化输出
网络爬虫的执行过程
- ①. 获取初始URL;
- ②. 爬取存储页面内容, 并获取新的URL(重点);
- ③. 将新的URL放在存储队列中;
- ④. 在存储队列中读取新的URL;
- ⑤. 判断是否满足结束条件,如果是,则停止爬取;如果否,则回到②
爬虫运行流程
单项的执行过程
①. 主调度器:用于控制调度整个爬取过程
②. url管理器:使用url管理器获取url
③. 下载器:下载url中的内容
④. 解析器:解析url中的数据
⑤. 数据库:对有价值的数据进行更新、入库。
def getPage(url):
'''爬取指定url页面信息'''
#可以使用urllib、requests请求数据
def parsePage(content):
'''解析爬取网页中的内容,并返回字段结果'''
#可以使用re、xpath、beautifulsoup4、pyquery解析
def writeFile(content):
'''执行文件追加写操作'''
def main(offset):
''' 主程序函数,负责调度执行爬虫处理 '''
# 判断当前执行是否为主程序运行,并遍历调用主函数爬取数据
if __name__ == '__main__':
#main(0)
for i in range(10):
main(offset=i*25)
time.sleep(1)
什么是Request和Response?
- 浏览器发送消息给该网址所在的服务器,这个过程叫做HTTP Request;
- 服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应处理,然后把消息回传给浏览器。这个过程叫做HTTP Response;
- 浏览器收到服务器的Response信息后,会对信息进行相应处理,然后展示;
Request中包含什么?
- **请求方式:**主要有GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等;
- **请求URL:**URL全称统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL唯一来确定;
- 请求头包含请求时的头部信息,如User-Agent、Host、Cookies等信息;
- 请求体请求时额外携带的数据,如表单提交时的表单数据;
Response中包含什么?
- **响应状态:**有多种响应状态,如200代表成功、301跳转、404找不到页面、502服务器错误;
- **响应头:**如内容类型、内容长度、服务器信息、设置Cookie等等;
- 响应体最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等。
爬虫能抓怎样的数据?
- **网页文本:**如HTML文档、Json格式文本等。
- **图片、视频:**如获取到的是二进制文件,保存为图片或视频格式。
- **其他:**只要是能请求到的,都能获取。
怎样来解析?
- 直接处理。
- Json解析。
- 正则表达式。
- BeautifulSoup.
- PyQuery.
- XPath.
怎样解决JavaScript渲染的问题?
- 分析Ajax请求
- Selenium/WebDriver
- Splash
- PyV8、Ghost.py
可以怎样保存数据?
- 保存为纯文本、Json、Xml等
- **关系型数据库:**如MySQL、Oracle、SQL Server等具有结构化表结构形式存储。
- **非关系型数据库:**如MongoDB、Redis等Key-Value形式存储。
- **二进制文件:**如图片、视频、音频等等直接保存成特定格式即可。
网络爬虫使用的技术
- 网络爬虫框架:scrapy
- python中相关的库:urllib、urllib3、requests、mechanize、selenium、splinter;
- 其中 urllib、urllib3、requests、mechanize 用来获取URL对应的原始响应内容 (高效);
- 其中 selenium、splinter 通过加载浏览器驱动, 获取浏览器渲染后的响应内容,模拟程度更高 (低效)
- 对于爬取的过程,主要是模拟浏览器向服务器发送构造好的http请求,常见类型有:get / post
- 对于数据解析方面,有相应的库:lxml, beautifulsoup4, re, pyquery等,常用方法:xpath路径表达式、css选择器 、正则表达式等;
- xpath路径表达式 、 css选择器 主要用于提取结构化数据;
- 正则表达式 用于提取非结构化的数据。
爬虫其他相关技术:
- 数据抓取:
- HTTP 协议、身份认证机制(Cookie)
- 网络流量分析: Chrome、Firefox,Firebug、Fiddler、Burpsuit
- 数据解析
- HTML结构、JSON数据格式、XML数据格式
- CSS选择器、Xpath路径表达式、正则表达式、Python编码/解码
- 数据入库
- 结构化数据库:MySQL、SQLite
- 非结构化数据库:Redis
- 其他:多线程、任务调度、消息队列、分布式爬虫、图像识别、反爬虫技术。