爬虫
爬虫概念
网络爬虫(web crawler),以前经常称之为网络蜘蛛(spider),是按照一定的规则自动浏览万维网并获取信息的机器人程序(或脚本),曾经被广泛的应用于互联网搜索引擎。使用过互联网和浏览器的人都知道,网页中除了供用户阅读的文字信息之外,还包含一些超链接。网络爬虫系统正是通过网页中的超链接信息不断获得网络上的其它页面。正因如此,网络数据采集的过程就像一个爬虫或者蜘蛛在网络上漫游,所以才被形象的称为网络爬虫或者网络蜘蛛。
应用领域
在理想的状态下,所有ICP(Internet Content Provider)都应该为自己的网站提供API接口来共享它们允许其他程序获取的数据,在这种情况下爬虫就不是必需品,国内比较有名的电商平台(如淘宝、京东等)、社交平台(如腾讯微博等)等网站都提供了自己的Open API,但是这类Open API通常会对可以抓取的数据以及抓取数据的频率进行限制。对于大多数的公司而言,及时的获取行业相关数据是企业生存的重要环节之一,然而大部分企业在行业数据方面的匮乏是其与生俱来的短板,合理的利用爬虫来获取数据并从中提取出有商业价值的信息是至关重要的。当然爬虫还有很多重要的应用领域,下面列举了其中的一部分:
搜索引擎 新闻聚合 社交应用 舆情监控 行业数据
爬虫流程
一个基本的爬虫通常分为数据采集(网页下载)、数据处理(网页解析)和数据存储(将有用的信息持久化)三个部分的内容,当然更为高级的爬虫在数据采集和处理时会使用并发编程或分布式技术,这就需要有调度器(安排线程或进程执行对应的任务)、后台管理程序(监控爬虫的工作状态以及检查数据抓取的结果)等的参与。
一般来说,爬虫的工作流程包括以下几个步骤
>>设定抓取目标(种子页面/起始页面)并获取网页。
>>当服务器无法访问时,按照指定的重试次数尝试重新下载页面。
>>在需要的时候设置用户代理或隐藏真实IP,否则可能无法访问页面。
>>对获取的页面进行必要的解码操作然后抓取出需要的信息。
>>在获取的页面中通过某种方式(如正则表达式)抽取出页面中的链接信息。
>>对链接进行进一步的处理(获取页面并重复上面的动作)。
>>将有用的信息进行持久化以备后续的处理。
开发技术清单以及这些技术涉及到的标准库和第三方库
>>下载数据 - urllib / requests / aiohttp
>>解析数据 - re / lxml / beautifulsoup4 / pyquery
>>缓存和持久化 - pymysql / sqlalchemy / peewee/ redis / pymongo
>>生成数字签名 - hashlib
>>序列化和压缩 - pickle / json / zlib
>>调度器 - 多进程(multiprocessing) / 多线程(threading)
相关了解
HTML
HTML页面通常由三部分构成,分别是用来承载内容的Tag(标签)、负责渲染页面的CSS(层叠样式表)以及控制交互式行为的JavaScript。可以通过浏览器右键菜单“查看网页源代码”或者F12开发人员工具来了解。
设置服务代理
有些网站会限制访问的区域,有些爬虫需要隐藏自己的身份,在这种情况下可以设置使用代理服务器,代理服务器有免费的服务器和付费的商业服务器,但后者稳定性和可用性都更好。
法律安全
大多数网站都会定义robots.txt文件,表明该网站对爬虫有哪些限制。
如果获取网页的速度过快,就会面临被封禁的风险,可以在两次下载之间添加延时从而对爬虫进行限速。
爬虫 反爬虫 前端
http://www.ciotimes.com/InfoSecurity/130120.html
缓存
白话:从网络下载到本地,一般是缓存到内存。
我们可能需要从已经抓取过的页面中提取出更多的数据,重新去下载这些页面。对于规模不大的网站倒是问题也不大,但是如果能够把这些页面缓存起来,对性能会有明显的改善。可以使用Redis来提供高速缓存服务。
动态内容/动态渲染
根据权威机构发布的全球互联网可访问性审计报告,全球约有四分之三的网站其内容或部分内容是通过JavaScript动态生成的,这就意味着在浏览器窗口中“查看网页源代码”时无法在HTML代码中找到这些内容。解决这样的问题基本上有两种方案,一是JavaScript逆向工程;另一种是渲染JavaScript获得渲染后的内容。
分布式实现/分布式部署
白话:团队工作、多台机器、不同地域的情况下如何协作。
并发下载:多进程/多线程
白话:多个Excel可以同时启用,就叫Excel支持多进程;单个Excel既可读又可写,就叫Excel支持多线程。
https://www.cnblogs.com/yuanchenqi/articles/6755717.html
爬虫框架
个人小型爬虫项目仅用python自带的相关库就能实现:比如urllib、re、requests等
分布式协作时最好使用框架,python语言的爬虫框架有多种,比较出名的是Scrapy。
Scrapy教程: