我的爬虫之路

如果数据都整齐地存在我的库里,那该有多好。

1

何谓爬虫?

爬虫,实际上是一种通过模拟用户请求,依据一定的规律,将网页上的数据整齐地抓取下来的自动化工具。

规律:爬虫的运行依据规则;因此更适合处理有规律的网页

网页:爬虫只能获得网页上有的信息,网页上没有的信息爬虫也无能为力

整齐:爬虫可以将非结构化的网页解析为结构化的数据

自动化:爬虫模拟请求、解析网页的过程是自动化的

实现普通的爬虫很简单,只需要几天就可以学会。本文中3-6适用于普通爬虫,7-9适用于大型爬虫,10适用于某些学习社会研究方法的专业。

2

在学爬虫前,我用过什么方法?

即使不借助工具,我们也可以通过复制、粘贴完成爬虫的工作。为了简化操作,我曾尝试使用模拟鼠标键盘的脚本开发工具,这类软件的代表包括:

AutoHotkey:支持读写文件、支持读取系统信息、编程逻辑支持程度高、英文编程(https://www.autohotkey.com)

按键精灵:支持中文编程、编程逻辑支持程度低、有大量现成脚本(http://www.anjian.com)

TC:支持中文编程、编程逻辑支持程度差、有很多现成插件

这一类工具的原理,就是通过对屏幕上的点加以判断,模拟鼠标、键盘的操作,实现打开、切换网页,复制指定内容,并粘贴到目标位置。

这种方法运行直观,容易上手,但运行效率极低,受到的限制也极多;在程序运行时,电脑将被完全占用。

3

从哪儿开始学爬虫?

为了提高运行效率、减少抓取限制,我开始尝试由程序根据url去请求网页,并通过解析网页内容获取信息。

当前常用的编程语言虽各有优劣,但都可以用来写爬虫;对于初学者来说,不同语言的区别并不大。各种语言的优劣势如下:

C、C++、C#:运行效率最高,运行性能最强;但是上手成本最高,代码成型最慢

Java:生态圈成熟,运行效率高;但是代码成型慢,上手困难

Python:最容易上手;现有爬虫框架多,开发效率高;可以直接用源代码运行,方便配置;当前大部分爬虫由Python实现,为主流爬虫语言;但是作为解释执行语言,运行效率较低

PHP:处理并发能力差,不适合多线程爬虫;但是较容易上手

Node.js;Perl;Golang……

4

如何获得url?

url(统一资源定位符),就是浏览器网址栏中的字符串,互联网上每一个文件都对应一个唯一的url。

在抓取中,我们获得了url,就可以通过它请求对应的文件了。

有的网页输入url后就可以返回我们想要的内容;有的网页则是通过异步加载的,网页要运行js向后端请求数据来显示,这样我们直接请求url就得不到想要的内容(通常,我们会使用抓包的方式找到网页js请求的包含想要的内容的url,并直接请求它)。

为了获取url,主要需要学习如下内容:

HTTP协议:TCP/IP协议模型(主要用于理解爬虫运行过程)、协议版本(HTTP1.0/HTTP 1.1/HTTP 2.0)

请求方法:GET、POST(PUT、DELETE、PATCH)

前端异步加载方法

网络请求抓包方法

网络请求抓包推荐使用浏览器自带的开发工具(通过F12打开),理解其中Elements、Console、Sources、Network四个选项卡的功能即可满足大部分的抓取。

5

如何解析url返回结果?

请求url返回的结果,通常有有以下这几种类型,每一种都有对应的处理方法:

HTML DOM(网页):通过XPath、CssSelector解析dom结构或使用正则表达式匹配

Json:通过Json解析器解析

文本:使用正则表达式匹配

其他文件(Js、Css、图片、视频等):直接下载保存

除此以外,我们还需要注意返回结果的编码格式(ASCII、ISO-8859-1、GB2312、GBK、UTF-16、UTF-8),以及网页可能的变化(有些类名、标签结构有可能是会变化的)。

6

如何处理复杂网站?

有一些网站加载方式复杂,或使用了难以破解的加密方法,无法找到、或无法正常使用包含目标信息的url,这时我们可以使用Selenium(https://www.seleniumhq.org/projects/webdriver)模拟访问来实现抓取。

Selenium是一种浏览器自动化测试框架,可以操控Chrome、Firefox等浏览器,实现近乎完全模拟人类使用浏览器的访问。但是使用Selenium抓取需要运行js渲染页面,因此抓取效率会比较低。

7

如何应对网站反爬虫策略?

爬虫的运行发送大量的请求,占用网站服务器的带宽,因此大部分的网站不欢迎我们的爬虫,并设计了各种反爬虫的策略,来阻挡可能是由机器发出的请求。这导致有的时候,我们请求了url,却没有返回想要的结果;或者当我们多次请求后,返回了异常的结果。

常见的反爬虫策略一般包括:

基于请求信息的:

headers中的user_agent(模拟正常请求的user_agent)

在headers中添加token(模拟请求或模拟登录获得token)

在cookies中添加登录状态(模拟登录获取拥有登录状态的cookies)

帐号封锁(注册多个帐号以避免同一帐号请求次数过多)

Js计算的cookies密码锁(模拟请求js并计算密码锁)

IP封锁(使用代理IP以避免同一IP请求次数过多)

限制代理IP访问

url参数加密(读取网页js获取url加密参数算法)

正常请求组合监测(请求目标url的同时请求html、css及js等其他需要同时请求的文件,模拟正常访问)

基于网页解析的:

Js混淆:通过样式显露字符,添加多余隐藏字符,伪元素content显示信息、标签偏移显示

替换字符集(同时爬取字符集以对应字符)

iframe异步加载

验证请求的人类身份的:

图形验证码、滑块验证码

防御非指向性爬虫的:

爬虫陷阱

8

如何提高爬虫效率?

假设我们要抓取40万本图书的数据,每本书请求、处理需要5秒,那么我们需要抓取23天,这样的速度我们显然是不想接受的。

因此,为了提高爬虫的运行效率,我们有如下方式:

减少访问次数:尽可能一次采集、去除重复url

非阻塞的多线程、多进程运行爬虫:使用更高效的线程控制模块、合理地分割任务(抓取、数据预处理、数据处理、数据保存)

分布式运行爬虫

提高数据写入速度:降低数据写入频率、使用高速缓存

优化请求方式(TCP、DNS)

优化网页解析方法:使用正则式替代HTML解析等

优化内存使用方式

优化异常处理机制

使用效率更快的编程语言

9

用爬虫还需要学什么?

将数据抓回来后,需要将数据储存起来。一般而言,既可以将数据写入到本地文件(Excel、txt、Json),也可以将数据存入数据库中(SQL、NoSQL)。

另外,我们需要优化爬虫的管理方式,提高爬虫设计速度,因此我们需要了解爬虫框架项目管理相关的知识。

有些网站已经有人爬过,并把代码上传到了技术社区了;因此我们在设计爬虫前可以先在Github(https://github.com) 或CSDN(https://blog.csdn.net) 等IT社区先找一找有没有现成的爬虫可供参考。

当爬虫需要运行较长的时间时,我们可能需要在爬虫运行的过程中暂停它,因此有的爬虫需要设计断点续传的功能。

爬虫的目标网站总在变化,爬虫的抓取随时可能出现异常;因此我们需要设计错漏校验的功能,以便及时发现错误,提醒我们。

10

爬虫数据怎么用?

欢迎阅读《高等数学》、《线性代数》、《统计学》、《概率论与数理统计》、《多元统计分析》、《统计方法与SPSS应用》、《市场调查方法与技术》、《应用时间序列分析》、《应用回归分析》、《应用随机过程》等精彩有趣的书籍……

—END—

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181206G0ITH700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券