3.3 网络抓取数据

在进行某些特定的文本数据分析时,不论是自有数据还是公开的文本数据资源都无法提供满足分析需求的文本数据,比如需要分析某一社交网站上关于最近某一热门话题的评论文本,或者需要分析某一电子商务平台上某一类商品的顾客评价文本,这些文本数据都存储在网页上,并没有现成的数据资源,通过人工获取的方式费时费力,并不可行,这时就要借助网络文本数据抓取技术来获取所需文本。

3.3.1 什么是网络数据抓取

网络数据抓取即依赖网络爬虫技术获取所需数据的数据收集方式。网络爬虫(Web crawler),也被称为网络蜘蛛(Web spider),根据字面意思,可以将互联网就比作一张大网,网络爬虫就是在网上爬行的蜘蛛,遇到资源就会抓取下来。严格来讲,网络爬虫是指,按照一定的规则自动的抓取互联网信息的程序或者脚本,可以实现对网络内容的自动浏览,对于能够访问的页面内容均可自动采集,进而获得所需数据资料。

3.3.2 网络爬虫基本原理

从网站某一个页面开始,读取网页内容,并找到网页中其他链接地址,通过链接地址访问新的网页并读取网页内容复制到本地,此过程不断循环直至所有的网页都抓取下来为止。

3.3.3 网络数据抓取流程

  1. 明确需要抓取数据源的 URL
  2. 构造 HTTP 请求获取对应 URL 的返回相应,一般这样的返回结果为 HTML 文档
  3. 通过解析得到的 HTML 或者其他格式的文本信息,获得其中的所需的数据
  4. 处理保存这些数据

这样就是一个典型的网络数据抓取流程

3.3.4 爬虫相关包

在 Python 中与爬虫有关的包有很多,比如标准库的中的 urllib 与 urllib2 都提供了很多方法来方便的处理网络抓取中的各种问题

另外第三方包中,requests 是一个非常好用的处理网络请求方面的包,封装优美,调用灵活。

另外,不能不提的有 Python 中爬虫方面的集大成框架包 Scrapy ,Scrapy 是一个用来开发爬虫程序的框架,提供了用以做网络爬虫方方面面的支持与工具,适合用来做比较大型的、流程复杂的,需要大规模部署使用的爬虫程序。

3.3.5 数据存储

一般而言,因为我们在抓取前已经计划好抓取的数据形式,所以,一般我们使用普通的关系型数据库来保存抓取并解析处理好的数据,比如使用 MySQL ,当然如果数据量不大,也可以直接使用 SQLite 来进行数据保存,这样不管在数据的写入、读取还是查询方面都很方便。

3.3.6 爬虫效率的提升

爬虫程序的运行过程中,最主要的效率消耗就是在网络 IO 过程中的等待,所以提升爬虫效率,最重要点就是提高爬虫程序的网络 IO 效率,但是我们知道网络请求的延时是客观网络环境造成的,很难从硬件上立即提升,所以一般提升爬虫的效率都是从提高爬虫的执行体的并发度这个角度进行的。

可以这样理解这个思路,网络 IO 的等待过程中,计算机是闲置的,如果我们能利用起来这个计算机的空闲,让各个执行体的等待时间重叠,这样就提升了整体的处理效率,也就是串行执行变为并行执行。

具体可以使用的方法有很多,比如可以将爬虫程序多进程启动,利用多线程模型来开发爬虫程序,或者利用 Python 中的协程的特性来提高程序的并发度,另外也可以直接使用一些高性能网络库来提高抓取效率,比如 Gevent、Twisted 等等。

3.3.7 网络数据抓取实例

3.3.7.1 爬取静态网站

抓取静态网站比较简单,因为网页的全部内容会随着请求相应返回,直接处理相应的返回结果,解析获得数据。

3.3.7.2 爬取异步动态网站

因为现在很多网站因为客户体验的需要,很多网页内容的加载是异步进行的,也就是一次的请求无法获得完成网页内容,完整的网页内容需要页面中的 JavaScript 代码在浏览器中运行并获取其他数据后才能得到。

对于这样的类型的网页处理的办法会根据目标网页的具体情况来定夺。比较通用的办法是通过无头浏览器(Headless Browser)进行渲染后,得到最终结果的 HTML 后在进行页面解析处理。一般用的比较的多的无头浏览器是 PhantomJS 。

results matching ""

    No results matching ""