学爬虫是按部就班的过程,做为零基础小白,大致上可分为三个阶段,第一阶段是入门,掌握必备的基础知识,第二阶段是模仿,跟着别人的爬虫代码学,弄懂每一行代码,第三阶段是本身动手,这个阶段你开始有本身的解题思路了,能够独立设计爬虫系统。python
爬虫涉及的技术包括但不限于熟练一门编程语言(这里以 Python 为例) HTML 知识、HTTP/HTTPS 协议的基本知识、正则表达式、数据库知识,经常使用抓包工具的使用、爬虫框架的使用、涉及到大规模爬虫,还须要了解分布式的概念、消息队列、经常使用的数据结构和算法、缓存,甚至还包括机器学习的应用,大规模的系统背后都是靠不少技术来支撑的。爬虫只是为了获取数据,分析、挖掘这些数据才是价值,所以它还能够延伸到数据分析、数据挖掘等领域,给企业作决策,因此做为一名爬虫工程师,是大有可为的。正则表达式
那么是否是必定要把上面的知识全学完了才能够开始写爬虫吗?固然不是,学习是一生的事,只要你会写 Python 代码了,就直接上手爬虫,比如学车,只要能开动了就上路吧,固然写代码可比开车安全多了。算法
用 Python 写爬虫,首先须要会 Python,把基础语法搞懂,知道怎么使用函数、类和经常使用的数据结构如 list、dict 中的经常使用方法就算基本入门。接着你须要了解 HTML,HTML 就是一个文档树结构,网上有个 HTML 30分钟入门教程 够用了。而后是关于 HTTP 的知识,爬虫基本原理就是经过网络请求从远程服务器下载数据的过程,而这个网络请求背后的技术就是基于 HTTP 协议。做为入门爬虫来讲,你须要了解 HTTP协议的基本原理,虽然 HTTP 规范用一本书都写不完,但深刻的内容能够放之后慢慢去看,理论与实践相结合。sql
网络请求框架都是对 HTTP 协议的实现,好比著名的网络请求库 Requests 就是一个模拟浏览器发送 HTTP 请求的网络库。了解 HTTP 协议以后,你就能够专门有针对性的学习和网络相关的模块了,好比 Python 自带有 urllib、urllib2(Python3中的urllib),httplib,Cookie等内容,固然你能够直接跳过这些,直接学习 Requests 怎么用,前提是你熟悉了 HTTP协议的基本内容。这里不得不推荐的一本书是《图解HTTP》。数据爬下来,大部分状况是 HTML 文本,也有少数是基于 XML 格式或者 Json 格式的数据,要想正确处理这些数据,你要熟悉每种数据类型的解决方案,好比JSON数据能够直接使用 Python自带的模块 json,对于 HTML 数据,可使用 BeautifulSoup、lxml 等库去处理,对于 xml 数据,除了可使用 untangle、xmltodict等第三方库。数据库
入门爬虫,学习正则表达式并非必须的,你能够在你真正须要的时候再去学,好比你把数据爬取回来后,须要对数据进行清洗,当你发现使用常规的字符串操做方法根本无法处理时,这时你能够尝试了解一下正则表达式,每每它能起到事半功倍的效果。Python 的 re 模块可用来处理正则表达式。这里也推荐几个教程:正则表达式30分钟入门教程 Python正则表达式指南 正则表达式彻底指南编程
数据清洗完最终要进行持久化存储,你能够用文件存储,好比CSV文件,也能够用数据库存储,简单的用 sqlite,专业点用 MySQL,或者是分布式的文档数据库 MongoDB,这些数据库对Python都很是友好,有现成的库支持。 Python操做MySQL数据库 经过Python链接数据库json
从数据的抓取到清洗再到存储的基本流程都走完了,也算是基本入门了,接下来就是考验内功的时候了,不少网站都设有反爬虫策略,他们千方百计阻止你用非正常手段获取数据,好比会有各类奇奇怪怪的验证码限制你的请求操做、对请求速度作限制,对IP作限制、甚至对数据进行加密操做,总之,就是为了提升获取数据的成本。这时你须要掌握的知识就要更多了,你须要深刻理解 HTTP 协议,你须要理解常见的加解密算法,你要理解 HTTP 中的 cookie,HTTP 代理,HTTP中的各类HEADER。爬虫与反爬虫就是相爱相杀的一对,道高一次魔高一丈。如何应对反爬虫没有既定的统一的解决方案,靠的是你的经验以及你所掌握的知识体系。这不是仅凭21天入门教程就能达到的高度。浏览器
数据结构和算法缓存
进行大规模爬虫,一般都是从一个URL开始爬,而后把页面中解析的URL连接加入待爬的URL集合中,咱们须要用到队列或者优先队列来区别对待有些网站优先爬,有些网站后面爬。每爬去一个页面,是使用深度优先仍是广度优先算法爬取下一个连接。每次发起网络请求的时候,会涉及到一个DNS的解析过程(将网址转换成IP)为了不重复地 DNS 解析,咱们须要把解析好的 IP 缓存下来。URL那么多,如何判断哪些网址已经爬过,哪些没有爬过,简单点就是是使用字典结构来存储已经爬过的的URL,可是若是碰过海量的URL时,字典占用的内存空间很是大,此时你须要考虑使用 Bloom Filter(布隆过滤器),用一个线程逐个地爬取数据,效率低得可怜,若是提升爬虫效率,是使用多线程,多进程仍是协程,仍是分布式操做。安全
关于实践
网上的爬虫教程多如牛毛,原理大致相同,只不过是换个不一样的网站进行爬取,你能够跟着网上的教程学习模拟登陆一个网站,模拟打卡之类的,爬个豆瓣的电影、书籍之类的。经过不断地练习,从遇到问题到解决问题,这样的收获看书无法比拟的。
爬虫经常使用库
urllib、urlib2(Python中的urllib)python内建的网络请求库
urllib3:线程安全的HTTP网络请求库
requests:使用最普遍的网络请求库,兼容py2和py3
grequests:异步的requests
BeautifulSoup:HTML、XML操做解析库
lxml:另外一种处理 HTML、XML的方式
tornado:异步网络框架
Gevent:异步网络框架
Scrapy:最流行的爬虫框架
pyspider:爬虫框架
xmltodict:xml转换成字典
pyquery:像jQuery同样操做HTML
Jieba :分词
SQLAlchemy:ORM框架
celery :消息队列
rq:简单消息队列
python-goose :从HTML中提取文本
书籍
《图解HTTP》
《HTTP权威指南》
《计算机网络:自顶向下方法》
《用Python写网络爬虫》
《Python网络数据采集》
《精通正则表达式》
《Python入门到实践》
《本身动手写网络爬虫》
《Crypto101》
《图解密码技术》
教程
Python爬虫学习系列教程
Python入门网络爬虫之精华版
Python网络爬虫
爬虫入门系列