第一章 网络爬虫入门
第二章 基本库的使用
第三章 解析库的使用
第四章 数据存储
第五章 动态网页的抓取
爬虫又被称为网页蜘蛛、网页机器人,爬虫是一种按照一定的规则,自动的抓取互联网信息的程序或脚本。网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中收集网页,采集信息,这些网页信息用于建立索引,从而为搜索引擎提供支持,它决定了整个搜索引擎的内容是否丰富,信息是否及时,因此爬虫的性能的高低直接决定了搜索引擎的效果。
一般来说,在互联网中展示的信息可以说是公共的,不能被爬取的信息都写在网站的Robots协议中了,但并不代表遵守Robots协议就一定没有问题,爬虫的行为还要“类似人的操作”,不能不限制爬虫的速度。
Robots协议(爬虫协议)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守该协议。
下面是淘宝网的Robots协议:
打开https://www.taobao.com/robots.txt:
京东的robots协议:
爬虫除了要遵守Robots协议外,我们使用网络爬虫时还要对自己进行约束:
过于快速的爬取或者爬取频繁都会对服务器造成巨大的压力
有些服务器上的数据有产权归属,爬取后用数据来牟利将带来法律风险
网络爬虫具有一定的突防能力,使用爬虫获取被保护的数据会导致信息泄露
URI (Uniform Resource Identifier) :统一资源标志符
URL (Universar Resource Locator) : 统一资源定位符
例如:https://github.com/favicon.ico即是一个URl,也是一个URL,即有这样一个图标资源,用URL/URI来唯一指定了它的访问方式,这其中包含了访问协议HTTPS、访问路径(即根目录)和资源名称favicon.ico。通过这个链接,我们就可以在互联网中找到这样一个资源。
url格式:
基本格式如下:
schema://host[:port#]/path/…/[?query-string][#anchor]
schema: 协议(例如:http,https,ftp)
host:服务器的IP或域名
port#:服务器的端口
path:访问资源的路径
query:string参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
下面给个例子:http://localhost:8888/hello
http是协议,localhost是服务器的主机名,8888是端口号,hello是资源的路径
URL是URI的一个子集,也就是说每一个URL都是URI,但不是每一个 URI都是URL,URI还包括一个子类叫做URN(Universal Resource Name),它是统一资源名称:
URN:只命名资源而不指定如何定位资源,比如:
urn:isbn:1203102348
它只是指定了一本书的ISBN,可以唯一标识这本书,但是没有指定到哪里定位这本书
URI包括URL和URN。
现在的URN用得比较少,几乎所有的URI是URL,所以,一般的网页链接可以认为是URI,也可以认为是URL。
超文本(Hypertext):浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列的HTML代码,里面包含了一系列的标签,比如:
浏览器将解析这些标签后,便形成了我们平常看到的网页,而网页的源代码HTML就可以称作超文本。在浏览器中打开任意网页界面,鼠标在任意位置右击,点击“检查”,在弹出的界面上方的选项框中点击“Elements”就可以查看网页的源代码了,那一个个标签就是超文本。
- 查看网页源代码的功能几乎是每一个浏览器必备的功能,前端人员可以利用该功能查看网页效果、找bug。
- 在浏览器中,也使用F12(有些电脑是Fn+F2)快捷键来打开调试界面
- 你学会了这个调试功能,下次遇到某些网页禁止复制网页内容,你想到了解决办法吗?
在https://www.baidu.com这个链接中,URL的开头会有https或http,这个就是访问资源所需要的协议类型,有时还会看到ftp、sftp、smb开头的URL,这些也是协议类型,常用的协议是HTTP和HTTPS。
HTTP(Hyper Text Transfer Protocol)的中文名字叫超文本传输协议,用于从网络传输超文本数据到本地浏览器的传输协议,能保证高效而准确的传送超文本文档。由万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)共同合作和制定的规范。
HTTPS(Hyper Test Transfer protocol over Secure Socket Layer)是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,简称为HTTPS,安全基础是SSL,因此通过它传输的内容都是经过SSL加密。
HTTPS的主要作用分为两种:
建立一个信息安全通道,来保证数据传输的安全
确认网站的真实性
越来越多的网站和App都在向HTTPS方向发展,因此,HTTPS流行是大势所趋。
在浏览器中输入一个url,回车之后便可以在浏览器中观察到页面内容,这个过程是浏览器向网站所在的服务器发送了一个请求,网站的服务器接收到这个请求后进行处理和解析,然后将对应的响应传回给浏览器。
在浏览器的调试界面查看请求的详细信息:
下面是点击请求资源列表中任意一个后展示的更详细的信息,其中包括General(总览),Response Headers(返回头),**Request Headers(请求头)**这三部分。各个部分下都是它的详细信息:
请求大致包含4部分:
请求方法有很多,但最常见的请求只有GET
和POST
:
GET:
在浏览器中直接输入URL并回车,便发起了一个GET
请求,请求的参数会包含在URL中,例如:在百度中搜索Python,这就是一个GET
请求,请求链接为https://www.baidu.com/s?wd=Python
,URL中包含了请求的参数信息,这里wd(word)参数表示要搜索的关键字,它的值(Python)就是搜索的内容。
POST:
POST
请求大多数在表单提交时发起,例如:对于一个登录表单,输入用户名和密码后,点击“登录”按钮,这通常会发起一个POST
请求,起数据通常以表单的形式传输,而不会体现在URL中。
GET和POST的区别:
GET
请求中的参数包含在URL中,数据可以在URL中看到,而POST
请求的URL不会包含这些数据,数据都是通过表单的形式传输的,会包含在请求体中GET
请求提交的数据最多只有1024字节,而POST
请求没有限制常用请求汇总:
方法 | 描述 |
---|---|
GET | 请求页面,并返回页面内容 |
HEAD | 类似于GET请求,只不过返回的响应体中没有具体的内容,用于获取报头 |
POST | 大多用在提交表单或上传文件,数据包含在请求体中 |
PUT | 从客户端向服务器传送的数据取代指定文档中的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | 把服务器当作跳板,让服务器代替客户端访问其它页面 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
请求的网址:即统一资源定位符URL,可以唯一确定我们想要请求的资源
请求头:用来说明服务器要使用的附加信息,比较重要的信息有Cookie、Referer、User-Agent
下面是一些常用的请求头的信息:
Accept:请求报头域,用于指定客户端可接受那些类型的信息。
Accept-Language:指定客户端可接受的语言类型。
Accept-Encoding:指定客户端可接受的内容编码。
Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置,从HTTP1.1开始,请求必须包含此项内容。
Cookie:也常用复数形式Cookies,这是网站为了辨别用户进行会话跟踪而存储在本地的数据,它的主要功能是维持当前访问会话。例如:我们输入用户名和密码成功登陆到某个网站后,服务器会用会话保存登陆状态信息,后面我们每次刷新或请求该站点的其它页面时,会发现都是登陆状态,这就是Cookie的功劳。Cookies里面有信息标识了我们所对应的服务器的会话,每次在请求该站点时,都会在请求头长加上Cookies并将其发送给服务器,服务器通过Cookies识别出是我们自己,并且查出当前状态是登陆状态,所以返回结果就是登陆之后才能看到的网页内容。
Referer:此内容用来识别这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等
User-Agent:简称UA,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本信息等。在做爬虫是加上此信息,可以将爬虫伪装成浏览器,如果不加,将会是默认的爬虫的UA,很有可能会被识别为爬虫。
Content-Type:也叫做互联网媒体信息(Internet Media Type)或者MIME类型,在HTTP协议消息头中,它用来表示具体请求中的媒体类型信息。例如,text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型,更多的对应关系大家可以查看这张表:http://tool.oschina.net/commons
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求服务器会认为是新的客户端,为了维护它们之间的联系,让服务器知道这次请求和上一次请求是同一个用户,必须在一个地方保存客户端的信息,
- Cookie通过在客户端记录信息确定用户身份
- Session通过在服务器端记录信息确定用户身份
所以,请求头是请求中的重要组成部分,一般爬虫都要处理请求头。
响应由服务器端返回给客户端,可以分为三部分:
响应状态码表示服务器的响应状态:
响应状态码 | 含义 |
---|---|
200 | 正常 |
301 | 本网页永久性转移达到另一个地址 |
302 | 请求的资源暂时驻留在不同的URI下 |
304 | 服务器已近执行了GET,但文件未变化 |
400 | 请求出现语法错误 |
403 | 客户端未能获得授权 |
404 | 在指定位置不存在所申请的资源 |
500 | 服务器遇到了意料不到的情况 |
503 | 服务器由于维护或者负载过重未能应答 |
响应头包含了服务器对请求的应答信息,如Content-Type
、Server
、Set-Cookie
等,下面是一些常用的响应头信息:
响应中最重要的当属响应体的内容,响应的正文数据都在响应体中,
比如:
在爬虫中,我们获得的就是HTML代码,通过解析HTML代码来获取我们想要的内容。
网络爬虫的流程主要分为以下三步:
获取网页:给一个网址发送请求,该网址就会返回网页数据,类似于在浏览器中输入一个网址后按下回车出现网页。
解析网页:从返回的页面数据中提取想要的信息。类似于在网页中找到商品的价格。
存储数据:把提取出的信息保存下来,可以保存为文件,也可以存储到数据库中。
获取页面:urllib、requests(重点),selenium(重点)、多线程、登录抓取、突破IP封禁
解析网页:re(重点)、BeautifulSoup、lxml(重点)、pyquare
存储数据:txt文件(重点)、csv文件(重点)、图片文件、MySQL数据库(重点)
框架:Selenium、Scrapy