公司数据团队工程师在研究爬虫采集时的心得和奇思妙想。
爬虫、反爬虫、反反爬虫.... 舌头打结ing
爬虫
简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper)、网络蜘蛛(Web spider),其行为一般是先“爬”到对应的网页上,再把需要的信息“铲”下来。
分类
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。
通用网络爬虫
通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬取对象从一些种子 URL 扩充到整个 Web。主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。
通用网络爬虫的结构大致可以分为页面爬取模块 、页面分析模块、链接过滤模块、页面存储模块、URL 队列、初始 URL 集合几个部分。为提高工作效率,通用网络爬虫会采取一定的爬取策略。 常用的爬取策略有:深度优先策略、广度优先策略。
1) 深度优先策略(DFS):其基本方法是按照深度由低到高的顺序,依次访问下一级网页链接,直到不能再深入为止。
2) 广度优先策略(BFS):此策略按照网页内容目录层次深浅来爬取页面,处于较浅目录层次的页面首先被爬取。 当同一层次中的页面爬取完毕后,爬虫再深入下一层继续爬取。
聚焦网络爬虫
聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬取那些与预先定义好的主题相关页面的网络爬虫。 和通用网络爬虫相比,聚焦爬虫只需要爬取与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求。我们之前爬的歌单就属于这一种。
增量式网络爬虫
增量式网络爬虫(Incremental Web Crawler)是指对已下载网页采取增 量式更新和只爬取新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬取的页面是尽可能新的页面。 和周期性爬取和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬取新产生或发生更新的页面 ,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬取的网页,减小时间和空间上的耗费,但是增加了爬取算法的复杂度和实现难度。现在比较火的舆情爬虫一般都是增量式网络爬虫。
深网爬虫
Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。
爬虫入门
安装scrapy
创建项目
在开始爬取之前,您必须创建一个新的Scrapy项目。 进入您打算存储代码的目录中,运行下列命令:
该命令将会创建包含下列内容的 tutorial 目录:
编写第一个爬虫
Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。其包含了一个用于下载的初始URL,以及如何跟进网页中的链接以及如何分析页面中的内容的方法。
以下为我们的第一个Spider代码,保存在 tutorial/spiders 目录下的 quotes_spider.py文件中:
为了创建一个Spider,你必须继承 scrapy.Spider 类, 且定义以下三个属性:
name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据以及生成需要进一步处理的URL的 Request 对象。
进入项目的根目录,执行下列命令启动spider:
提取数据
我们之前只是保存了HTML页面,并没有提取数据。现在升级一下代码,把提取功能加进去。至于如何使用浏览器的开发者模式分析网页,之前已经介绍过了。
再次运行这个爬虫,你将在日志里看到被提取出的数据:
保存爬取的数据
最简单存储爬取的数据的方式是使用 Feed exports:
该命令将采用 JSON 格式对爬取的数据进行序列化,生成quotes.json文件。
Pyspider
架构简介
pyspider的架构主要分为 scheduler(调度器), fetcher(抓取器), processor(脚本执行):
各个组件间使用消息队列连接,除了scheduler是单点的,fetcher 和 processor 都是可以多实例分布式部署的。 scheduler 负责整体的调度控制
任务由 scheduler 发起调度,fetcher 抓取网页内容, processor 执行预先编写的python脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。
每个脚本可以灵活使用各种python库对页面进行解析,使用框架API控制下一步抓取动作,通过设置回调控制解析动作。
爬虫编写入门
实例练习:抓取电影的相关信息
安装
启动
运行成功后用浏览器打开http://localhost:5000/访问控制台
选取url
既然我们要爬所有的电影,首先我们需要抓一个电影列表,一个好的列表应该:
包含足够多的电影的 URL
通过翻页,可以遍历到所有的电影
一个按照更新时间排序的列表,可以更快抓到最新更新的电影
我们在 http://movie.douban.com/ 扫了一遍,发现并没有一个列表能包含所有电影,只能退而求其次,通过抓取分类下的所有的标签列表页,来遍历所有的电影: http://movie.douban.com/tag/
创建项目
在 pyspider 的 dashboard 的右下角,点击 “Create” 按钮
替换 on_start 函数的 self.crawl 的 URL:
self.crawl 告诉 pyspider 抓取指定页面,然后使用 callback 函数对结果进行解析。
@every 修饰器,表示 on_start 每天会执行一次,这样就能抓到最新的电影了。
点击绿色的 run 执行,你会看到 follows 上面有一个红色的 1,切换到 follows 面板,点击绿色的播放按钮:
Tag 列表页
在 tag 列表页 中,我们需要提取出所有的 电影列表页 的 URL。你可能已经发现了,sample handler 已经提取了非常多大的 URL,所有,一种可行的提取列表页 URL 的方法就是用正则从中过滤出来:
由于 电影列表页和 tag列表页长的并不一样,在这里新建了一个 callback 为 self.list_page
@config(age=102460 * 60) 在这表示我们认为 10 天内页面有效,不会再次进行更新抓取
由于 pyspider 是纯 Python 环境,你可以使用 Python 强大的内置库,或者你熟悉的第三方库对页面进行解析。不过更推荐使用 CSS选择器
电影列表页
再次点击 run 让我们进入一个电影列表页(list_page)。在这个页面中我们需要提取:
CSS Selector Helper
在 pyspider 中,还内置了一个 CSS Selector Helper,当你点击页面上的元素的时候,可以帮你生成它的 CSS选择器 表达式。你可以点击 Enable CSS selector helper 按钮,然后切换到 web 页面:
开启后,鼠标放在元素上,会被黄色高亮,点击后,所有拥有相同 CSS选择器 表达式的元素会被高亮。表达式会被插入到 python 代码当前光标位置。创建下面的代码,将光标停留在单引号中间:
点击一个电影的链接,CSS选择器 表达式将会插入到你的代码中,如此重复,插入翻页的链接:
翻页是一个到自己的 callback 回调
电影详情页
再次点击 run,follow 到详情页。使用 css selector helper 分别添加电影标题,打分和导演:
开始抓取
使用 run 单步调试你的代码,对于用一个 callback 最好使用多个页面类型进行测试。然后保存。
回到 Dashboard,找到你的项目
将 status 修改为 DEBUG 或 RUNNING
按 run 按钮
反反爬虫技术
越来越多的网站具有反爬虫特性,有的用图片隐藏关键数据,有的使用反人类的验证码等
爬虫:
爬虫的根本就是得到一个网页的源代码数据。更深入一些,就会出现和网页进行POST交互从而获取服务器接收POST请求后返回的数据!总结:爬虫就是由计算机自动与服务器交互获取数据的工具。(爬虫请注意网站的Robot.txt文件!不要让爬虫违法!也不要让爬虫对网站造成伤害!)
反爬及反反爬概念:
基于服务器资源,保护数据等,很多网站是限制了爬虫效果。那么由人来充当爬虫的角色时,我们怎么获取网页源代码?大部分都是右键源文件。那么有些网站屏蔽了右键,又该怎么办?基本常识,当然是按我们的F12了
在把人当作爬虫时,网页屏蔽右键就是反爬取措施,F12就是我们反反爬取的方式!
网站: https://github.com/luyishisi/Anti-Anti-Spider
例子
例子在
https://pan.baidu.com/disk/home?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=#/all?vmode=list&path=%2F%E7%88%AC%E8%99%AB
夏洛克 AIOps
Make Data Think
人工智能 | 机器学习 | IT运维
领取专属 10元无门槛券
私享最新 技术干货