数据采集之爬虫、反爬虫、反反爬虫

公司数据团队工程师在研究爬虫采集时的心得和奇思妙想。

爬虫、反爬虫、反反爬虫.... 舌头打结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运维

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180830G0KEA700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券