如果数据都整齐地存在我的库里,那该有多好。
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—
领取专属 10元无门槛券
私享最新 技术干货