type
status
date
slug
summary
tags
category
icon
password
web crawler
一、基础知识
(一)网络数据采集概述
1. 网络爬虫基本工作原理
1.由用户给定一组网页URLs,作为爬虫程序的输入,爬虫程序会将它们存放在待爬取队列中。
2.调度器(Scheduler)会从待爬取URL队列中逐一取出URL,判断该URL是否已经被爬取过,即执行去重判断,之后,按照一定的遍历策略或负载策略,对URL发起网络爬取任务,也就是执行相应的HTTP请求。
3.下载器将逐一执行调度器产生的每个HTTP请求,下载对应的Web内容,返回结果包括:HTML网页、CSS文件、JavaScript、图片等等。
4.解析器对下载器获得的HTML页面内容进行解析,提取出用户关心的部分内容,这其中,既包括用户感兴趣的关键数据;也包括有待下一步爬取的新的URLs
5.存储器负责按照一定的存储模式,将解析器提取得到的用户兴趣数据存储到文件或数据库中,以供后续数据分析和处理使用。
6.解析器提取的需要进一步爬取的新URLs,会被送往待爬取URLs队列。
(二)相关web技术
1. URL
(Uniform Resource Locator)统一资源定位符
网络爬取的入口
- URL格式:
URL= scheme:[//authority]path[?query][#fragment]
①访问模式或通信协议
指示服务器采用哪种协议或应用服务,来接收来自客户端的请求,并给予响应。
②用户信息
例:
ftp://test:test@192.168.0.1:21/profile
③主机名称(或IP地址)
即web网页所在服务器的域名或是IP地址。
④访问端口
服务器上某个正在运行的网络服务程序的访问地址。
例:
http://localhost:8888/notebooks/Documents/
缺省时表示默认端口,有时需要改变其默认端口,此时不能省略
⑤路径
路径由1个或多个“”符号隔开的字符串组成,一般用来表示主机上的一个web访问目录或具体的文件路径。
⑥查询(非必需)
查询常用于向网站服务器传递参数,查询通常由?开始,查询参数使用参数名=参数值的格式,有多个参数时,中间用& (and)符号隔开。
⑦片断(非必需)
通常以一个#号开启,用于辅助定位。
2. 超文本传输协议
HTTP基于TCP协议
HTTP工作原理:
- HTTP由请求和响应构成,采用客户端-服务器模式工作。
- 客户端也即浏览器或网络爬虫程序,发出HTTP请求,而服务器对请求进行响应。
具体工作过程:
- 用户输入URL,客户端程序在完成域名解析后,获得服务器IP地址;
- 通过服务器上操作系统提供的TCP/IP协议栈程序,与服务器建立TCP连接,与服务器建立TCP连接(TCP的三次握手);
- TCP连接建立后,客户端程序将HTTP请求封装为HTTP数据包,再封装为TCP数据包,发往服务器;
- 服务器接收HTTP请求后,根据请求内容进行响应,响应数据也封装为HTTP数据包,然后再封装为TCP包,回复给客户端。
- 服务器关闭这次TCP连接。等待新的请求。
3. HTTP请求头
①
Accept
参数用于向服务器申明客户端(浏览器)可以接受的媒体类型(MIME)的资源。
常见赋值:
text/html、application/xhtml+xml、application/xml类型表示客户端允许接收文本、HTML文件、XML文件等,可使用通配符/。
②
Accept-encoding
参数参数的作用是向服务器声明客户端(浏览器)允许接收的压缩编码算法
常见赋值:
gzip,deflate或 br等等。
③
Accept-Language
参数用于向服务器申明客户端允许接收的语言。常见赋值
en-US, en和zh-CN等。
q,取值范围是从0到1,q表示了权重,en-US的权重最高,为1,中文网站通常会将zh的权重q设为0.9。
④.
Cache-control
参数用于控制客户端的缓存。
常见赋值
private、no-cache、max-age、must-revalidate默认为private,意思是由浏览器自身决定缓存大小。
⑤
Connection
参数
用于设置浏览器是否需要与服务器持久连接。常见取值:
keep-alive表示需要持久连接
no表示完成此次访问后即关闭连接。
⑥
Cookie
参数网站服务器为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据(通常经过加密)。
在HTTP请求头中设置这个参数,在向服务器发送请求时,就会将保存在该参数下的cookie值发送给web服务器,服务器根据这些值可以获得用户信息和访问历史。
⑦
Host
参数
用于指定请求发往的服务器的域名和端口号。⑧
Upgrade-insecure-Requests
参数
被赋值为1时,用于声明浏览器支持从http请求自动升级为https请求,并且在以后发送请求的时候都使用https;
设置为0时则不允许升级为HTTPs。⑨
User-Agent
参数
用于向服务器发送浏览器的版本、系统、应用程序的信息。常见赋值:
Mozilla/5.0(Windows NT 10.0; WOW64)、AppleWebKit/537.36(KHTML, like Gecko).Chrome/72.0.3626.121、Safari/537.36
⑩
Refer
参数
用于告诉服务器,客户端是通过哪个页面跟踪到当前页面的。即客户端访问的上一页面地址。4. HTTP响应
(1)HTTP响应状态码
也称为HTTP Status Code,它指示了当前网络访问的状态。
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。
- 从100到199 响应类型为“信息”,即服务器收到请求,提示客户端继续执行某项操作;
- 从200到299 响应类型为成功,表示客户端请求被服务器成功接收并处理;
- 从300到399 响应类型为重定向,表示客户端请求需要进一步的操作以完成请求;
- 从400到499 响应类型为客户端错误,表示请求包含语法错误或无法完成请求;
- 从500到599 响应类型为服务器错误,表示服务器在处理请求的过程中发生了错误。
例:
状态码100
表示继续。客户端应继续其请求。
状态码101
表示切换协议。服务器根据客户端的请求切换协议。
状态码200
表示请求成功。一般用于GET与POST请求的响应。
状态码201
表示已创建。请求成功并创建了新的资源。
状态码202
表示已接受。即服务器已经接受请求,但未处理完成。
状态码301
表示永久移动。
请求的资源已被永久的移动到新URL,返回信息会包括新的URL,浏览器会自动定向到新URL
今后任何新的请求都应使用新的URL代替。
状态码302
表示临时移动。与301类似。客户端应继续使用原有URl。
状态码400
表示客户端请求的语法错误,服务器无法理解。
状态码401
表示请求要求用户的身份认证。
状态码403
表示服务器理解请求客户端的请求,但是拒绝执行此请求。
状态码404
表示服务器无法根据客户端的请求找到资源(网页)。
状态码500
表示服务器内部错误,无法完成请求。
状态码501
表示服务器不支持请求的功能,无法完成请求。
状态码502
表示作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应。
(2)响应头
1.
Access-Control-Allow-Origin
参数用于指定哪些网站可以跨域源资源共享。
常见取值:
*
表示允许所有网站跨域共享。2.
Accept-Patch
参数
用于指定服务器所支持的文档补丁格式。
例如取值:text/example;charset=utf-8表示支持文本,编码格式为utf-83.
Accept-Ranges
参数
表示服务器所支持的内容范围。常见取值为bytes
4.
Age
参数
表示响应对象在代理缓存中存在的时间,以秒为单位。5.
Allow
参数
用于指定对于特定资源的有效动作。常见取值:GET, HEAD等方法。
6.
Cache-Control
参数
用于通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒。例:设置值为max-age=3600,表示缓存有效时间为1小时。
7.
Content-Disposition
参数表示对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作。
8.
Content-Encoding
参数表示响应资源所使用的编码类型。
常见取值为gzip等。
9.
Last-Modified
参数
表示所请求的对象的最后修改日期。10.
Set-cookie
参数
用于设置HTTP cookie值。11.
Date
参数
用于指明响应发送时的日期和时间。12.
Expires
参数
用于指定一个日期/时间,超过该时间则认为此响应已经过期。13.
Server
参数
用于指明服务器名称。14.
Transfer-Encoding
参数
用于表示实体传输给用户的编码形式。5. HTML超文本标记语言
<IDOCTYPE html>
声明为HTML5文档;<html>
标签是HTML页面的根标签;
每一个HTML文档的最外层都是<html>
标签对。<head>
标签用于定义HTML文档的头部,是所有头部元素的容器。
HTML头部常含有<title>
标签,用于定义文档的标题。<base>
标签,它为页面上的所有链接规定的默认地址或默认目标。<link>
标签,用于定义文档与外部资源之间的关系。
<link>
最常用于连接样式表。<style>
标签用于为HTML文档定义样式信息。<meta>
标签
meta元素被用于规定页面的描述、关键词、文档的作者、最后修改时间以及其他元数据。<body>
元素定义了可见的页面内容。<h1>
-<h6>
等标签用于定义HTML中从1级到6级的标题。这类标签标记的内容,会以粗体或大号字体形式显示。<p>
标签,用于定义HTML文档中的段落。<a>
标签用于定义URL链接。
每个html都可以设置属性,<a>
标签中常见的属性是href。href这里会包含新的url
<img>
标签用来定义图像,标签img中,可以设置属性src,用于指定图片的路径位置;<table>
标签用来定义表格。每个表格均有若干行,行由<tr>
标签定义,每行被分割为若干单元格,单元格由<td>
标签定义。字母td指表格数据(table data),即数据单元格的内容。无序列表由
<ul>
标签指定,列表中的每个列表项使用<li>
来指定。
有序列表由<ol>
标签指定,列表中的每个列表项使用<li>
来指定。<div>
标签是可用于组合其他HTML元素的容器,本身没有特定的含义。常与CSS一同使用,对大的内容块设置样式属性。<span>
标签可用作文本的容器,本身没有特定的含义。当与CSS一同使用时,<span>元素可用于为部分文本设置样式属性。<form>
标签用于定义HTML表单,表单用于搜集不同类型的用户输入。<script>
标签
用于定义客户端脚本,比如JavaScript。script元素既可包含脚本语句,也可通过src属性指向外部脚本文件。
JavaScript最常用于图片操作、表单验证以及内容动态更新。样式表,全称是层叠样式表(Cascading StyleSheets),简称CSS 单独组织样式,是为了解决内容与表现分离的问题。HTML文档本身组织内容,CSS样式表定义如何显示。这样可以极大提高工作效率。网页中最常见的资源: HTML文档 CSS样式表 JavaSCRIPT脚本
6. 文本文件存储数据
纯文本文件,缺少格式控制,也被称为无结构文本,机器可读性较差。
Csv文件的全称是逗号分隔值文件,因为分隔字符通常是逗号,当分割符不是逗号时,可以称其为字符分隔值文件。
XML文件被设计用来在互联网上传输和存储数据。例:
Json文件,是另一种文本文件。它使用JavaScript对象表示法来组织数据。
二、实操
windows+R-->cmd-->
jupyter notebook
Urllib库
访问url
传递参数
设置代理
进行身份认证
Requests库
基于urllib,使用更加简洁
主要特点
可以自动保持和网站的tcp连接
能够自动保持与网站的TCP连接
能够内含带持久cookie的会话机制
能够提供像浏览器类似的SSL认证
能够自动完成内容解码
能够支持文件分块上传和流式下载
能够自动对下载图片、文件进行解压
能够支持Unicode响应结果
Web页面内容解析
在实践中,有3种基本思路:
第一种,称为全局解析。即根据构成Web文档树形标记结构,构建Web页面的全局DOM模型,将Web页面整体映射为内存中的DOM对象。
这种方式的优点是内容完整、元素内部关系准确;而缺点是占用较多内存,处理速度较慢。
第二种方式,称为局部解析。这种方式不在内存中构建Web页面的全局DOM对象,而是利用逐步加载文本的流式读取程序,是取局部Web元素或文本;
这种方式比较适合处理较大Web文档,节约内存;缺点是提取结果的准确性和完整性较第一种方式略弱。
第三种方式,被称为适应性方法。
适应性方法是结合前两种方法的混合型方法。在解析前先预判目标Web文档的大小,然后根据一定的阈值,确定处理方式。例如,文档大小超过1MB的Web页面,采用局部解析,而小于1MB这个阈值的Web页面,可以采用全局解析。
需要爬取的数据分为3类:
第一类是无结构的文本数据,例如常见的txt纯文本数据;
第二类是半结构化的标记型数据,例如HTML网页、Json数据、Xml文档、Yaml数据等等;
第三类是结构化的数据,例如关系数据库文件、Excel电子表格文件、Word文件等等;
1. 文本内容的解析
- 正则表达式 又称规则表达式,通常被用来检索、替换那些符合某个模式((规则)的文本。 对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
- re模块:正则表达式的各个操作集
第一步:编译正则表达式
使用
compile()
函数将正则表达式的字符串形式编译为一个Pattern对象;
第二步:对目标字符串进行匹配
通过Pattern对象提供的一系列方法对文本进行匹配查找,获得匹配结果(Match对象);
第三步:提取结果信息
使用Match对象提供的属性和方法获得信息,还可根据需要进行其他的操作。正则表达式部分笔记来自学线核心面试备考
- 写正则表达式
正则表达式是用于匹配字符串的一种表达式语言,可以通过一些特定的字符和语法来表达匹配规则。
1.
runoo+b
+
表示前面的字符至少出现一次(1次及以上)(1+)2.
runoo*b
*
表示前面的字符可以出现0次 1次或多次3.
colou?r
?
表示前面的字符最多出现一次(0次或1次) (出现或不出现)4.
^a
以a开头 [^a]
不是a的任意字符 [^ABC]
不是ABC的任意字符 (此处^
放在[]
中表示否定)5.
a$
最后一个字母是a6.
\bStr
匹配以Str开头的单词(只能用于英文,不能用于中文)7.
ing\b
匹配以ing结尾的单词8.
.
任意单个字符9.
\w
匹配了全部的单词字符(除下划线之外的标点符号,汉字) \W
与\w
相反11.
\s
匹配空格和换行符 \S
与 \s
相反12.
\d
匹配所有数字\D
与\d
相反13.
[ABCD]
ABCD中任意一个字符 相当于[A-D]
14.匹配特殊意义的字符可以用
\
进行转义15.
a{3}
连续出现3次a(aaa) a{3,}
连续出现3次及以上a a{2,3}
连续出现2次--3次a16.
(abc)
含有abc这个字符串17.
b(?=a)
匹配字符b
,这个字符b
的后面紧跟着一个a
18.
b(?!=a)
匹配字符b
,这个字符b
的后面不是a
19.
(?<=a)b
匹配字符b
,这个字符b
的前面是a
20.
(?<!a)b
匹配字符b
,这个字符b
的前面不是a
21.
(T|t|a|A)
匹配T或t或a或A下面是一些常见的正则表达式示例:
1.匹配Email地址:
该正则表达式可以匹配符合Email地址规则的字符串,包括用户名、域名和域后缀等部分。
2.匹配电话号码:
^1[3-9]\d{9}$
该正则表达式可以匹配符合中国大陆电话号码规则的11位数字,以1开头,第二位为3-9之间的数字。
3.匹配URL:
^((https?|ftp|file):\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w.-]*)*\/?$
该正则表达式可以匹配符合URL规则的字符串,包括协议、域名、路径等部分,同时支持http、https、ftp和file等协议。
4.非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
2. 类XML内容的解析
XPath解析
XPath (XML Path Language),是一种在XML文档中查找信息的语言,可用来在类XML文档中对元素和属性进行遍历。
XPath通过路径表达式谓词、通配符、逻辑运算符等语法实例实现信息查找。
XPath使用路径表达式来选取XML文档中的节点或节点集。
- 谓语(Predicates)用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。
- XPath通配符可用来选取未知的XML元素。
- 通过在路径表达式中使用“”运算符,可以选取若干个路径。
3. JSON数据的解析
- JSON数据: 作为一种轻量级的数据交换格式,目前被广泛应用于web编程和数据交换。 是javascript中的对象和数组,通过这两种结构可以表示各种复杂的结构。 JSON的详细说明,参考w3school的标准教程。
- python中自建了JSON处理模块json。 json模块提供了四种方法,用于将JSON字符串或JSON文件,与Python对象进行相互转化。
json.dumps()
将python类型转化为json字符串,返回一个str。json.dump()
将Python内置类型序列化为json对象后写入文件。json.loads()
把json格式字符串解析为python对象,返回一个python对象。json.load()
读取文件中json形式的字符串元素,转化成python类型。
- JsonPath方法 JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,JsonPath对于JSON来说,相当于XPATH对于XML。
4. OFFICE文档的解析
问题解决:安装pandas库,还需安装openpyxl库安装失败(报错原因:网络问题)需:更换镜像源pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/
5. 数据库文件的解析
自动跨越身份认证
1. web身份认证技术概述
(1)HTTP基本认证(HTTP Basic Auth)
HTTP基本认证是一种允许Web浏览器或者其他客户端在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
HTTP基本认证就是我们平时在网站中最常用的通过用户名和密码登录来认证的机制。
- 优点 HTTP基本认证是基本上所有流行的网页浏览器都支持。但是基本认证很少在可公开访问的互联网网站上使用,有时候会在小的私有系统中使用。
- 缺点 HTTP基本认证虽然足够简单,但是前提是在客户端和服务器主机之间的连接足够安全。如果没有使用SSL/TLS这样的传输层安全的协议,那么以明文传输的密钥和口令很容易被拦截。
(2)OAuth(开放授权)
OAuth是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源,而无需将用户名和密码提供给第三方应用。
- OAuth 2.0运行流程
- 第一步 客户端(Client)向资源拥有者(Resource Owner)发送授权请求(Authorization Request) ;
- 第二步 资源拥有者授权许可(Authorization Grant);
- 第三步 客户端向验证服务器(Authorization Server)发送通过(B)获取的授权许可;
- 第四步 验证服务器验证授权许可,通过的话,则返回Access Token给客户端;
- 第五步 客户端通过Access Token访问资源服务器(Resource Server) ;
- 第六步 资源服务器返回受保护的资源(ProtectedResource)
(3)Cookie/Session认证机制
- cookie Cookie是由客户端保存的小型文本文件,其内容为一系列的键值对; 由HTTP服务器设置的,保存在浏览器中; 会随着HTTP请求一起发送。
- session
Session是存储在服务器端的,避免在客户端Cookie中存储敏感数据;
可以存储在HTTP服务器的内存中,也可以存在内存数据库(如redis)中。
为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象。
通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。
当我们关闭浏览器的时候,cookie会被删除,但可以通过修改cookie的expire time使cookie在一定时间内有效。
(4)基于Token的认证机制
有着无需长期保存用户名和密码,服务器端能主动让token失效等诸多好处,非常实用于Web应用和App,已经被很多大型网站采用。
- 使用流程:
客户端使用用户名和密码请求登录;
服务端收到请求,去验证用户名与密码;
验证成功后,服务器会签发一个Token,再把这个Token发送给客户端;
客户端收到Token以后可以把它存储起来,如Cookie或者Web Storage ;
客户端每次向服务端请求资源的时候,都需要带着服务器端签发的Token ;
服务器端收到请求,验证客户端请求里面带着的Token如果验证成功,就向客户端返回请求的数据;否的话,则返回对应的错误信息。
- 存储在客户端Token存在的问题
- 存在泄露的风险 如果别人拿到你的Token,在Token过期之前,都可以以你的身份在别的地方登录。
- 如果存在Web Storagei 由于Web Storage可以被同源下的Java Script直接获取到,这也就意味着网站下所有的Java Script代码都可以获取到web Storage,这就给了XSS机会。
- 如果存在Cookie中 虽然存在Cookie可以使用Http Only来防止XSS,但是使用Cookie却又引发了CSRF对于泄露的风险,可以采取对Token进行对称加密,用时再解密。
对于XSS而言,在处理数据时,都应该escape and encode所有不信任的数据。
与CSRF相比,XSS更加容易防范和意识到,因此并不建议将Token存在Cookie中。
2. 自动跨越HTTP Basic认证
是一种在用户请求服务器资源时,要求用户先提供用户名和口令等身份凭证,进行身份认证的一种简单认证方式。
HTTP基本认证方式实现简单,但安全性不高,尤其是使用http协议传送明文密钥这一点使得这种身份认证在大型web系统中已经不多见,但仍存在于一些小型或早期建立的web系统中。
3. 自动跨越HTTP Digest认证
它不以明文方式在网络上发送密码。
它可以防止恶意用户捕获并重放认证的握手过程。可以有选择地防止对报文内容的篡改。
4. 自动跨越Oauth认证
OAuth协议为用户资源的授权提供了一个安全又简易的标准。
与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码,就可以申请获得该用户资源的授权。
可以用于Web、移动应用、桌面应用。
用户:
资源所有者,比如某个微信或qq账号的所有者;
授权或资源服务器:
保存着受保护的用户账号信息的服务器,同时它还担负着授权服务器的作用,用于验证用户身份然后为客户端派发资源访问令牌。
客户端:
希望获取用户身份信息、访问受限资源的第三方应用程序或网站。在访问实现之前,它必须先经过用户者授权,并且获得的授权凭证将进一步由授权服务器进行验证。
- OAuth的认证和授权过程的三阶段:
第一阶段
客户端(即某网站)和资源服务器之间的协商;
第二阶段
用户和资源服务器之间的协商;
第三阶段
网站和资源服务器存储的用户数据之间的协商。
RIA网站数据的爬取
RIA是Rich Internet Applications的缩写,指富互联网应用程序。
RIA是一种特殊的Web应用程序,其用户界面比第一代和第二代Web应用程序具有更丰富的功能。
JavaScript、Flash、Google Web Toolkit、JavaFX、Sitverlight
目前,HTML5+JavaScript +CSS3+JavaScriptFrameworks是构建RIA前端的主流技术。
JavaScript框架:
JQuery、AngularJS、D3、Sencha EXT-JS、SmartClient、Dart
RIA在加载数据时往往采用异步加载XML或JSON实现数据更新,而页面的URL并不改变。
AJAX
AJAX,指异步Java Script和XML,它是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。
在不重新加载整个网页的情况下,对网页的某部分进行更新。
浏览器端:
用户浏览一个 RIA页面时,通过鼠标或键盘激发一个JavaScript事件后,浏览器会生成一个XMLHttpRequest对象,然后将这个请求对象通过互联网送给服务器;
服务器端:
服务器收到XMLHttpRequest对象后,会根据请求生成一个响应,并通过网络传递给浏览器。
浏览器收到服务器响应后,会使用Javascript处理反馈数据,然后更新页面内容。
服务器响应内容,可以通过XMLHttpRequest对象的responseText或responseXML属性获取。
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
如果响应内容以XML格式返回,则需要使用responseXML属性。
当请求被发送到服务器时,需要执行一些基于响应的任务。
每当readyState改变时,就会触发onreadystatechange事件。
readyState属性存有XMLHttpRequest的状态信息。
模拟人工操作爬取网站数据
通过操纵鼠标和键盘,模拟人使用浏览器来触发Javascript Action,当页面数据被异步加载后,直接从页面内容中读取所需数据。
Selenium:
一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作。
不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器。
可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
Selenium可以与Chrome、IE、Firefox等多款浏览器有机结合,但需要事先安装相关库和程序。
Scrapy爬虫
Scrapy爬虫框架的基本组成和工作原理
(1)基本组成
Scrapy是一个用于爬取网页、提取结构化数据的应用框架,可用于数据挖掘、信息处理或历史归档等多种应用系统。
Scrapy Engine(引擎)
负责Spider、ltemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递...
scheduler(调度器)
负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader (下载器)
负责下载Scrapy Engine (引擎)发送的所有Requests请求,并将其获取到的 Responses交还给Scrapy Engine (引擎),由引擎交给Spider来处理。
Spider (爬虫)
负责处理所有Responses,从中分析提取数据,获取ltem字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
ltem Pipeline(管道)
负责处理Spider中获取到的ltem,并进行后期处理(详细分析、过滤、存储等)。
以流水线方式对Spider解析后得到的结果(Item),用户可以定义一组操作顺序,包括:清理、检验、查重、存储到数据库等。
Downloader Middlewares (下载中间件)一个可以自定义扩展下载功能的组件。
Spider Middlewares (Spider中间件)
一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses和从Spider出去的Requests)。
(2)工作原理
- 请求发起与调度
Spiders经Spider中间件向Engine发送Requests;
Engine将爬取请求交给Scheduler,完成调度。
- 请求执行与响应
Scheduler将调度后Requests交给Engine;
Engine将请求转发给Downloader;
Downloader执行下载并将响应Response对象提交给Engine;
Engine将Response对象送给Spiders,用于提取ltem和跟踪Links。
- 结果输出与新请求的产生
Spiders处理Response对象,解析出结构化的爬得数据ltem和新Links,并送给Engine;
Engine将ltems送给ltem pipelines完成输出处理;
Engine将新Requests送给Scheduler,产生新请求。
Downloader Middleware
定义这些中间件来修改、丢弃和新增请求或响应。Spider Middleware
对请求和爬取项的再处理,可以修改、丢弃、增加请求和爬取项。
(scrapyws) E:\Anaconda\envs\scrapyws>
Scrapy-Redis
使用Redis-scrapy模块,扩展scrapy爬虫框架,构建分布式网络爬虫的方法。
分布式爬虫
一组计算机,通过网络相互连接,通信后协调它们的行为而形成的系统。
组件之间相互协调,共同完成一个计算任务。
需要进行大量计算的任务,分割成小块,由多台计算机分别计算存储,再上传数据结果,最终汇总合并为最终的数据结果。
分布式爬虫系统是用于完成数据采集任务的分布式系统。
(1)主从式分布式爬虫
不同的服务器承担不同的角色分工,其中有一台主服务器(也称URL服务器)专门负责待爬取URL的分发,其他服务器作为从服务器负责实际网页访问和资源下载。
主服务器不仅维护着待爬取URL队列,还担负着从服务器的负载均衡任务,确保各个从服务器的负荷大致相同。
(2)对等式分布式爬虫
服务器之间不存在分工差异,每台服务器承担相同的功能,各自负担一部分URL的抓取工作。
Redis-Scrapy
Redis
- 一种key-value存储系统 用于缓存、事件发布或订阅、高速队列等场景
- 支持多种数据结构 列表(List)、集合(Set)、有序集合(Sorted Set)
- 使用数据库存放URL,还可以防止爬虫意外中断后的继续爬取。
Redis-scrapy模块就是基于Redis和scrapy的一个分布式爬虫支持系统。
Redis-scrapy是在原有scrapy架构的基础上,增加了Redis组件。
取代Scrapy queue作为待爬取URL的请求队列,这一改变使得多个scrapy spider能够同时获取同一个URL队列中的待爬取请求。
为了从Redis中读取待爬取的请求,Redis-scrapy模块改变了原有scrapy中的schedular和spdier使其能够直接读取redis数据。
增加了redis中的请求去重功能。
- 作者:Rainnn
- 链接:https://tangly1024.com/article/a94680e4-2b37-43e2-9540-2df7c95ef430
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。