网络爬虫与网页自动化操作:最小化版系统学习的大纲
优采云 发布时间: 2022-05-12 02:08网络爬虫与网页自动化操作:最小化版系统学习的大纲
我是DJun(小丁),码龄18年,从事IT工作5年,踩过无数“语言”坑最后入坑Python,想通过公众号,把自己的成长经历与经验分享给朋友们。
同名酷安看看号“好想学Python”已开通,欢迎订阅。
本篇摘要
“网络爬虫”“网页自动化”听起来很神秘,其实入门并不会特别难。目前网络上关于Python爬虫的资料层出不穷。博文大多以具体应用内容为目标用简短代码实现基本功能,但缺乏大纲展现;网络视频教程或者书籍的覆盖较为全面,但缺乏灵活使用的经验总结。本篇介绍入门它们至少需要了解和学习的知识点,希望对需要的朋友有所帮助。
往期精选
>>>
>>>
>>>
>>>
>>>
>>>
>>>
01
什么是“网络爬虫”?什么是“网页自动化”?
“网络爬虫”是一种在网络上获取公开数据的操作方式,是一种获取网络上数据的程序或者脚本。常见的,比如某电影网站的电影评分数据、评论信息分析,比如某商品在各大电商平台的价位走势对比,等等,这些数据分析所用数据来源大多是通过爬虫获取的。
“网页自动化”是一种自动去操作网页浏览器实现某些测试目的的操作方式,是一种自动操作浏览器的程序或者脚本。常见的,比如Web开发者测试网站,比如抢车票、抢优惠券,等等。
02
为什么选用Python做它们的开发?
爬虫的本质是进行HTTP请求、获取数据、解析数据,网页自动化的本质是对浏览器程序发送操作指令,而Python等程序语言只是一种工具,大多数语言都可以实现前面所述的操作。Python因其语言特性灵活、易用性高、扩展性强、跨平台,快速开发,从各方面来看都极适合做“网络爬虫”“网页自动化”的开发。
03
系统学习的最小化版大纲内容
整体学习思路:数据存储结构——网页基础知识——程序开发应用
01
数据存储结构
① JSON/BSON
JSON是JavaScript Object Notation的缩写,意为JS对象简谱,是一种轻量级的数据交换格式。由于其易于人阅读和编写,同时也易于机器解析和生成,并能有效地提升网络传输效率,不论是在解析爬虫数据上,还是在程序中保存本地数据上,都非常好用。
BSON 缩写看起来很像JSON,它是Binary Serialized Document Format的缩写,意为二进制序列化式文档格式,是一种二进制存储格式,也可以做为网络数据交换的一种存储形式,具有轻量性、可遍历性、高效性的特点,常见于时常用于爬虫数据记录的MongoDB这种文档型数据库中,使用起来跟JSON并无太大差异。在MongoDB 数据库上可以以类似JSON的形式将文档数据写入数据库。
在Python中,操作JSON的模块叫json,是自带模块;操作MongoDB的第三方模块叫pymongo,可以通过pip命令直接安装。
②CSV
CSV是Comma-Separated Values的缩写,意为字符分隔值,是最常见的纯文本形式保存数据的格式。简单形容它的格式内容,通常是每行包含一个数据记录,同一行中用逗号对每列数据进行分隔,单行数据是像“1,Tom,male,18,student”这样的形式。
大多数人对这种格式的数据有一些误解,一个是它能用Excel打开,所以误称之为“Excel表文件”;一个是它每列数据都用逗号间隔,但不了解它的引号有“转义”的作用,可以对逗号、引号本身作转义。
通过改变“逗号”列分隔符、“引号”转义符、“回车”行分隔符的符号约定,可以产生各种变体,但实质都遵守类似CSV格式的规则。
在Python中,操作CSV的模块叫csv,是自带模块。
③TEXT
TEXT通常指纯文本数据,是最常见的文本数据格式,一般通过纯文本编辑器(比如记事本)直接打开即可阅读内容。
但需要留意的是,文本数据通常有“字符编码”的问题,因为底层是用字节数据储存的,显示成什么样的文字是“字符编码”决定的,但具体到某个文件的字符编码是“GBK”还是“UTF-8”又是文件内容决定的;也需要留意的是,CSV的本质是纯文本文件,也会有同样的“字符编码”的问题,用Excel直接打开CSV文件是最糟糕的选择,通常在Windows中文系统下Excel打开CSV文件默认只解析GBK编码。推荐使用EmEditor、Notepad++打开这类文件。
在Python中,操作TEXT通常通过直接的文件打开进行操作(open(),mode为'r'或'w')。
④XML
XML是Extensible Markup Language的缩写,意为可扩展标记语言,是一种通用的用于标记电子文件使其具有结构性的标记语言。它也可以存储数据,可以作标签、标记属性,还可以展现层级关系。用于展示网页内容的HTML超文本标记语言可以看成是它的子集。
在Python中,操作XML通常用第三方模块lxml进行操作,简单易用,可以通过pip命令直接安装。
⑤数据库
数据库是按照数据结构来组织、存储和管理数据的仓库。分为关系型数据库(SQLite、MySQL、Oracle、PostgreSQL等),非关系型数据库(Redis、MongoDB、Neo4J等)。关系型数据库通过SQL语句操作数据,效率非常高;非关系型数据库由于优化了查找性能和存储结构,常用于内容缓存、分布式文件系统、Web应用等。
SQLite是一款轻型关系型数据库,支持存储在单一文件中或内存中,而且Python自带SQLite的操作模块叫sqlite3,如果应用场景的要求并不高,用它很合适。
关系型数据库推荐学习MySQL,目前属于Oracle旗下产品,开源、体积小、速度快,一般中小型网站的开发都会选择它作为网站数据库。
非关系型数据库推荐学习MongoDB,由于采用BSON进行文档存储,在网络爬虫应用中非常好用。
02
网页基础知识
①HTML
HTML是HyperText Markup Language的缩写,意为超文本标记语言。对HTML最直观的的感受是在我们浏览网页的时候,在页面上所见到的内容。
爬虫的其中一种操作方式是,获取到HTML的源码数据,然后对其解析得到我们需要的数据内容。
浏览器可以直接查看HTML源码,通过自带的“开发者工具”(一般是按F12呼出),既可以分析代码,也可以在其中的Console里执行调试JS代码。在这里分析得到数据所在路径后,就可以很轻松地编写代码进行爬取了。
②JavaScript
JS,即JavaScript,是一种直译式脚本语言,可以用于给HTML网页增加动态功能。JavaScript引擎现已经成为浏览器的一部分。
在爬虫应用中,JS通常用于改变网页内容(比如去水印),或者获取以JS之外的方式难获取的网页内容,等;在网页自动化应用中,JS通常用于高级操作(比如下拉刷新),或者直接调用JS函数得到所需数据,等。
③XPath/CSS Selector
XPath是XML路径的意思,它是一种用来确定XML文档中某部分位置的强大语言。
CSS Selector是CSS选择器的意思,它是一种与XPath不同语法,但作用相似、功能同样强大的语言,一般用于CSS上。
通过XPath、CSSSelector这两件利器,总结具体网页的HTML元素排列规律,可以精准定位到我们所需要的数据的相关元素上,在某种程度上比以面向对象方式定位网页元素的操作(通常以BeautifulSoup作为代表)更为便捷。
第三方模块lxml支持XPath定位元素的操作;第三方模块PyQuery模仿jQuery方式处理HTML,可以使用与jQuery同款的CSSSelector定位元素;第三方模块selenium同时支持XPath和CSS Selector定位元素的操作。
03
程序开发应用
①Python模块:lxml +json + re +requests +selenium
在爬虫应用中,requests、selenium担当获取数据的角色,lxml、json、re担当解析数据的角色。requests适用于不需要JavaScript渲染就可以获取得到的网页数据或者API返回结果数据(比如百度搜索结果,天气JSON API)的情景,selenium适用于需要JavaScript渲染的情景(比如微博,空间,下拉刷新)。从requests或selenium获取到content或者page_source之后,根据数据类型进行处理,如果是json类型就用json模块解析,如果是HTML源码则用lxml解析。
在网页自动化应用中,selenium担当向浏览器发送控制指令的控制者角色,只要把需要做的自动操作通过程序代码直接实现即可。
笔者并不是很推荐用第三方模块BeautifulSoup进行HTML解析,在大多数情况下,它没有XPath那么简洁有力。
正则表达式解析(Python自带的re模块)在某些情况下甚是好用,但笔者建议,目前大多数解析数据的方式都可以通过HTML解析得到,较少出现需要正则表达式解析的情况,正则表达式的编写和维护相对XPath等较难,可以不用正则的时候尽量不要使用。
可能听说过像Scrapy这样的强大的爬虫框架,笔者建议初入门的朋友先跳过Scrapy,先掌握上述几个最常用的模块,之后再接触它。
②抓包工具:Fiddler
Fiddler官方地址:
通过Fiddler可以很方便地在访问网站的过程中进行抓包操作,其中一种应用情景是,找出在网页显示我们所要抓取的内容的背后可能进行的后台数据请求操作,然后配合requests模块直接把需要的数据一举抓取下来。
③面向对象:类(class)
网络博文在讲解具体爬虫应用时,往往为了简略实现,不会以面向对象的思维来写爬虫。优秀的项目代码例子较为少见。
在先前笔者的文章《面向你的对象,写一手漂亮的类》()中提到,面向对象可以“帮助我们更好地组织程序代码,在提高效率的同时,在程序内部实现高内聚、低耦合,后期维护也很方便”。而“网络爬虫”“网页自动化”的应用要形成一个大的项目规模的时候,必须在一开始的时候就以面向对象的思维进行思考,构建整个项目的框架,再逐步开发。
一个完整的“网络爬虫”项目,通常会包括获取数据、解析数据、保存数据等这几部分;而一个完整的“网页自动化”项目,通常会包括实施者的配置、实施操作步骤、记录操作结果等这几部分。编写代码时,可以分别对每个部分进行包装,并且把具体数据(比如网址URL、抓取规则、操作步骤数据)从代码中分离出来,从外部读入,程序代码内只实现固定不变的那几部分。
在做爬虫程序练习时,通常是以一个具体的实现目标来做的,我们可以就着这样的练习机会,把它们分别都当做是一个个的小项目对待,多参考相关资料,用面向对象的思维边学边做,从一个小的项目里把类包装完整,再拷贝到新的小项目中把它们复用起来。这样不仅能提升代码能力,而且积累出来的代码复用性会随着每一次的迁移、改进不断地提高,可以很大程度节省学习时间和开发新程序的成本。
希望本篇可以给感兴趣或者想要学习的朋友们带来帮助哈。
有其他疑问也请在下方留言提出,会尽力解答~