不知道Python爬虫?这篇文章丢给他(内含框架结构)
1
初识爬虫
我们所了解的爬虫概念和架构,只需要做一些简单的爬取工作即可,比如爬取百度百科这种纯信息展示的网页,这些都是不需要登录的静态网页。
而有些比较复杂的网页,则需要验证码、登录验证或者需要证书才能访问,但再复杂的爬虫网页和爬虫框架,实际上都离不开基本的爬虫架构。
首先我们需要一个爬虫调度端来启动和停止爬虫,同时也要通过它来监视爬虫的状态,并通过它提供接口来作具体的数据应用,这个部分不属于爬虫本身。
图中方框中的部分就是我们的爬虫程序;
因为有的页面的入口有很多,我们可以通过不同的Python调度路径来访问这个界面,那么作为一个智能的爬虫软件,当遇到我们已经爬取过的URL的时候,应该选择过滤,而不是再次爬取。
URL管理器就是用来存储已经爬取URL和将要爬取URL的工具的;
从URL管理器中选择一个待爬取的URL,将其传送给网页下载器,下载器会把网页以字符串的形式下载下来,并把这个字符串交给网页解析器去解析。
网页解析器一方面会把你需要获取的价值信息提取出来归还给调度器,另一方面,如果遇到该网页有新的URL待爬取,就会把这个URL传送给URL管理器。
然后这三个模块进行循环,直到该网页相关的所有URL都爬取完毕。
以上的动态运行流程,可以用下方更加清晰的时序图,这样看起来更直观,可以对照着上面的步骤理解下。
爬虫会从某个特定URL入手,自动的访问它所关联的URL,并且提取出我们所需要的数据。
这也是爬虫的价值:获取互联网上巨量的数据为我所用,利用数据服务于产品。
例如爬取 GitHub 中一天浏览量和 star 提升数最高的项目,有了这个数据,就可以做出一个 GitHub 开源项目推荐的项目。
现在各大网站的歌曲都有版权保护,下载歌曲不太方便,可以通过歌曲名字,爬取网上所有免费下载链接,这样就可以轻易做出一个歌曲搜索下载的聚类工具。
可以说,只要有数据,就没有做不到的。
用Python写爬虫,并不意味着单纯掌握一门Python语言就搞定爬虫了,要学的东西还是很多的,Python只是作为通关的基础。
而且涉及到大规模爬虫,还需要了解分布式的概念、消息队列、常用的数据结构和算法、缓存,甚至还包括机器学习的应用等等。
爬虫往精了学都是要靠很多技术来支撑的;
2
Python基础
下面总结的学习线路图大家可作为基础入门的参考:
3
知识点细分
关于爬虫学习的具体内容,我大概罗列了以下几大部分:
(1)网络爬虫基础知识:
爬虫的定义
爬虫的作用
Http协议
基本抓包工具(Fiddler)使用
(2)Python模块实现爬虫:
urllib3、requests、lxml、bs4 模块大体作用讲解
使用requests模块 get 方式获取静态页面数据
使用requests模块 post 方式获取静态页面数据
使用requests模块获取 ajax 动态页面数据
使用requests模块模拟登录网站
使用Tesseract进行验证码识别
(3)Scrapy框架与Scrapy-Redis:
Scrapy 爬虫框架大体说明
Scrapy spider 类
Scrapy item 及 pipeline
Scrapy CrawlSpider 类
通过 Scrapy-Redis 实现分布式爬虫
-> scrapy框架1
scrapy安装
创建项目
创建spider文件,编写parse方法
scrapy子命令
运行scrapy爬虫程序
-> scrapy框架2
命令行传递参数
进一步解析二级页面
parse方法之前传递参数
导出json、Csv格式的数据
scrapy爬虫的状态保存
-> scrapy框架3
item的定义
item的使用
pipeline的使用
使用pipeline将items存储至MySQL
scrapy整体架构
-> scrapy框架4
downloader middleware
使用downloader middleware实现IP代理池
spider middleware
scrapy插件
scrapy-redis
(4)借助自动化测试工具和浏览器爬取数据:
Selenium + PhantomJS 简单实例
Selenium + PhantomJS 网站登录
Selenium + PhantomJS 动态页面数据爬取
(5)爬虫项目实战:
使用requests编写-个简单爬虫
改造requestsl爬虫为多线程版
分布式爬虫
利用redis改造多线程版爬虫至分布式
01 基础阶段
刚上手的时候先过一遍Python最基本的知识;
比如说:变量、数据结构、语法等,知道怎么使用函数、类和常用的数据结构如list、dict中的常用方法就算基本入门。
像以下这些:
List dict:用来序列化你爬的东西
切片:用来对爬取的内容进行分割、生成
条件判断(if等):用来解决爬虫过程中哪些要哪些不要的问题
循环和迭代(for while):用来循环、重复爬虫动作
文件读写操作:用来读取参数、保存趴下来的内容等
这些是你后续开发Python爬虫的基础,所以这一部分还是非常重要的。
看完基础后,就是做一些小项目巩固基础,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习。
如果时间充裕的话可以买一本讲Python基础的书籍,再巩固一遍基础的同时你会发现自己诸多没有学习到的边边角角,这一步是对自己基础知识的补充。
其次就是去补充了解HTTP/HTTPS 协议基本原理等知识,理解网站POST GET的一些相关概念。
虽然 HTTP 规范用一本书都写不完,但深入的内容可以放以后慢慢去看。
还有网页前端三板斧html、css、js不能完全不懂,HTML并不是编程语言,只需要熟悉它的标记规则就可以。
这些做到大致了解就ok,毕竟你想要获取的数据都在前端中,如果你不了解一些的话就算你学会了Python你都不知道该抓取哪里也是没用的。
当然懂得越多肯定越好,不过零基础新手还是建议先掌握基本的内容再让深入拓展。
02 框架学习
Python爬虫的相关框架有很多,Requests、aiohttp、vibora、asks等等,这个同学们可以根据自己的喜好来选择,你觉得用哪个舒服就学那个就行。
就Python而言,只会requests显然是不够的,还需要了解scrapy和pyspider这两个框架。
scrapy_redis也是需要理解原理的,分布式如何搭建、如何解决其中遇到内存、速度等问题。
03 数据处理
我们在获取到网页数据之后下一步就是要进行数据的整理;
因为你通过工具获取到的数据并不仅仅是你需要的数据,里面会杂糅所有的数据,需要通过一定的规则去筛选和整理。
04 反爬措施
一定的反爬措施也是需要掌握的,大多数网站都会通过一定的技术来反爬虫,例如验证码,动态数据等等,学会反爬技术你才能好的获取到这些数据。
4
爬虫工作思路梳理
接下来就按爬虫的工作思路来梳理一遍:
使用Python爬取网页信息无外乎以下几点内容:
1)要会Python
2)知道网页信息如何呈现
3)了解网页信息如何产生
4)学会如何提取网页信息
如果你只想写一写简单的爬虫,不要炫技不考虑爬虫效率,过一遍以下:
数据类型和变量
字符串和编码
使用list和tuple
条件判断、循环
使用dict和set
甚至不需要掌握函数、异步、多线程、多进程,就差不多了。
假设已经熟悉了最基础的Python知识,那么进入第二步:知道网页信息如何呈现?你首先要知道所需要抓取的数据是怎样的呈现的。
放到网页信息来说这儿只有两种呈现方式:HTML、JSON;
知道了数据是由HTML和JSON呈现出来的,那么我们紧接着第三步:数据怎么来?
——发送请求,数据从服务器反馈
这个请求是什么请求?要搞清楚这一点你需要了解一下http的基础知识,更加准确来说你需要去了解GET和POST是什么,区别是什么。
requests可以模拟发出GET和POST请求;
拿到了数据,接着就是在这些错乱的数据中提取我们需要的数据,这时候我们有两个选择:
① Python正则表达式
再大再乱的内容,哪怕是大海捞针,也能给你捞出来。
对于文本的过滤或者规则的匹配,最强大的就是正则表达式,它同时适用于结构化与非结构化数据的提取。
对于网页来说,如果想找出网页源代码里有多少URL,用匹配URL的正则表达式去匹配即可。
② Beautiful Soup(bs4)
是借助网页的结构和属性等特性来解析网页的工具,能自动转换编码。支持Python标准库中的HTML解析器,还支持一些第三方的解析器。
论灵活性,比正则差点;
数据解析提取出来了,就是保存了!
2种常用的数据存储方式:存储成csv格式文件、存储成Excel文件。
爬回来的数据量较小时,可以使用文档的形式来储存,支持TXT、json、csv等格式,数据比较大时就要用到Mysql、MongoDB这些库了。
数据存储这里比较简单,掌握精通主流的数据存储库就行。
5
爬虫进阶
如果想要提高自己爬虫的爬虫效率,提高数据的精确性,就得再进阶。
进阶就是学会分析一些复杂的目标,比如说:淘宝、新浪微博登陆以及网易云的评论信息等等。
解析页面
主要是选择什么库或者哪些库结合能使解析速度更快;
可能你一开始你只是了解到了bs库,你发现它很好用,只要写爬虫,代码就是:
import requests
from bs4 import BeautifulSoup
bs当然很好用,但并不代表可以用正则表达式 解析的页面还需要使用bs, 也不代表使用lxml能 解决的还要动用bs,所以这些解析库的速度是 在进阶时要考虑的问题。
存储内容
刚开始学爬虫,一般爬取的结果只是打印出来,最后把在终端输出的结果复制粘贴保存就好了。
后来发现麻烦会用上xlwt/openpyxl/csv的把存储内容写入表格,再后来使用数据库sqlite/mysql/neo4j只要调用了库都很简单,当然这是入门。
进阶要开始学习如何选择合适的数据库,或者存储方式。当爬取的内容过千万的时候,如何设计使存储速度更快?
比如说当既有人物关系又有人物关系的时候,一定会用neo4j来存储关系,myslq用来存储用户信息,这样分开是因为如果信息全部存入neo4j,后期的存储速度会十分的慢。
当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题。
爬虫策略的学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说Scrapy。
除了爬取策略以外,还有以下这些也是必备的;
代理策略及用户策略
代理是爬虫进阶阶段必备的技能;
与入门阶段直接套用代理不同,在进阶阶段你需要考虑如何设计使用代理策略,什么时候换代理,代理的作用范围等等。
多用户的抓取策略考虑的问题基本上与代理策略相同,增量式抓取以及数据刷新。
比如说你抓取的是一个酒店网站关于酒店价格数据信息的,那么会有这些问题:
酒店的房型的价格是每天变动的,酒店网站每天会新增一批酒店,那么如何进行存储、如何进行数据刷新都是应该考虑的问题。
验证码问题
有很多人提到验证码,个人认为验证码不是爬虫主要去解决的问题,
验证码不多的情况考虑下载到本地自己输入验证码,再多的情况下考虑接入打码平台。
以上大概就分享这么多了,简单来讲爬虫程序其实主要就是:发送G请求、获取数据、解析数据,保存数据。
这四部分看着简单,实际上涉及到的知识面比较广泛,比如数据库、网络服务器、HTTP协议之类的众多其它知识。
想要用好爬虫要学的东西不少,一步一步来总会拿下的!
对于迷茫的初学者来说,爬虫技术起步学习阶段,最重要的就是明确学习路径,找准学习方法,后期的系统学习才会事半功倍,游刃有余。
END
最后:
欢迎关注「Python新手快速入门」
每天5分钟,学习一个Python小Tip!助力你成为更优秀的Python学习者~