Python网络爬虫基础


已写章节

第一章 网络爬虫入门
第二章 基本库的使用
第三章 解析库的使用
第四章 数据存储
第五章 动态网页的抓取


第一章 网络爬虫入门


1.1 为什么要学习爬虫


1.1.1 爬虫是什么

爬虫又被称为网页蜘蛛、网页机器人,爬虫是一种按照一定的规则,自动的抓取互联网信息的程序或脚本。网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中收集网页,采集信息,这些网页信息用于建立索引,从而为搜索引擎提供支持,它决定了整个搜索引擎的内容是否丰富,信息是否及时,因此爬虫的性能的高低直接决定了搜索引擎的效果。


1.1.2 网络爬虫能干什么

  • 兴趣爱好
  • 了解竞争对手
  • 抓取某个网站或应用中的内容,提取有用的价值
  • 提取数据,帮助做出更好的决策

1.1.3 能获得什么样的数据

  • 电影排名及详细信息
  • 社交媒体的帖子
  • 购物网站的商品价格和点评
  • 招聘网站的招聘信息
  • JSON 接口返回的 JSON 格式的数据

1.2 网络爬虫的约束


1.2.1 网络爬虫的合法性

一般来说,在互联网中展示的信息可以说是公共的,不能被爬取的信息都写在网站的Robots 协议中了,但并不代表遵守 Robots 协议就一定没有问题,爬虫的行为还要“类似人的操作”,不能不限制爬虫的速度。


1.2.2 Robots协议

Robots 协议(爬虫协议)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过 Robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守该协议。

下面是淘宝网的 Robots 协议:

打开https://www.taobao.com/robots.txt:
在这里插入图片描述
京东的robots协议:
在这里插入图片描述

1.2.3 网络爬虫约束

爬虫除了要遵守 Robots 协议外,我们使用网络爬虫时还要对自己进行约束:

  • 过于快速的爬取或者爬取频繁都会对服务器造成巨大的压力
  • 有些服务器上的数据有产权归属,爬取后用数据来牟利将带来法律风险
  • 网络爬虫具有一定的突防能力,使用爬虫获取被保护的数据会导致信息泄露

1.3 爬虫基本知识


1.3.1 HTTP 基本原理


1.3.1.1 URI 和 URL

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。


1.3.1.2. 超文本

超文本(Hypertext):浏览器里看到的网页就是超文本解析而成的,其网页源代码是一系列的 HTML 代码,里面包含了一系列的标签,比如:

  • <img> 标签显示图片
  • <p></p> 标签指定显示段落
  • <a>标签指定链接

浏览器解析这些标签后,便形成了我们平常看到的网页,而网页的源代码 HTML 就可以称作超文本
在浏览器中打开任意网页界面,鼠标在任意位置右击,点击“检查”,在弹出的界面上方的选项框中点击 “Elements” 就可以查看网页的源代码了,那一个个标签就是超文本。

  1. 查看网页源代码的功能几乎是每一个浏览器必备的功能,前端人员可以利用该功能查看网页效果、找 bug。
  2. 在浏览器中,也使用 F12(有些电脑是 Fn+F2 )快捷键来打开调试界面
  3. 你学会了这个调试功能,下次遇到某些网页禁止复制网页内容,你想到了解决办法吗?

1.3.1.3. HTTP 和 HTTPS

在 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 流行是大势所趋。


1.3.1.4 HTTP 请求过程

在浏览器中输入一个 url ,回车之后便可以在浏览器中观察到页面内容,这个过程是浏览器向网站所在的服务器发送了一个请求,网站的服务器接收到这个请求后进行处理和解析,然后将对应的响应传回给浏览器。


在浏览器的调试界面查看请求的详细信息:
在这里插入图片描述
下面是点击请求资源列表中任意一个后展示的更详细的信息,其中包括 General (总览)Response Headers(返回头),** Request Headers (请求头) **这三部分。各个部分下都是它的详细信息:
在这里插入图片描述

1.3.1.5 请求

请求大致包含4部分:

  • 请求方法(Request Method)
  • 请求的网址(Request URL)
  • 请求头 (Request Headers)
  • 请求体 (Request Body)

1. 请求方法

请求方法有很多,但最常见的请求只有 GETPOST :

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回显服务器收到的请求,主要用于测试或诊断

2. 请求的网址

请求的网址:即统一资源定位符 URL ,可以唯一确定我们想要请求的资源


3. 请求头

请求头:用来说明服务器要使用的附加信息,比较重要的信息有 Cookie 、Referer 、User-Agent

下面是一些常用的请求头的信息:

  • Accept:请求报头域,用于指定客户端可接受那些类型的信息。

  • Accept-Language:指定客户端可接受的语言类型。

  • Accept-Encoding:指定客户端可接受的内容编码。

  • Host:用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置,从 HTTP 1.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 通过在服务器端记录信息确定用户身份

所以,请求头是请求中的重要组成部分,一般爬虫都要处理请求头。


1.3.1.6 响应

响应由服务器端返回给客户端,可以分为三部分:

  • 响应状态码(Response Status Code)
  • 响应头(Response Headers)
  • 响应体(Response Body)

1. 响应状态码

响应状态码表示服务器的响应状态:

响应状态码含义
200正常
301本网页永久性转移达到另一个地址
302请求的资源暂时驻留在不同的 URI 下
304服务器已近执行了 GET ,但文件未变化
400请求出现语法错误
403客户端未能获得授权
404在指定位置不存在所申请的资源
500服务器遇到了意料不到的情况
503服务器由于维护或者负载过重未能应答

2. 响应头

响应头包含了服务器对请求的应答信息,如 Content-TypeServerSet-Cookie 等,下面是一些常用的响应头信息

  • Date:标识响应产生的时间
  • Last-Modified:指定资源最后修改时间
  • Content-Encoding:指定响应内容的编码
  • Server:包含服务器的信息,比如名称、版本号等
  • Content-Type:文档类型,指定放回的数据类型是什么,如 text/jepg 这代表图片
  • Set-Cookie:设置 Cookie 。响应头中的 Set-Cookie 告诉浏览器需要将此内容放在 Cookie 中,下次请求携带 Cookie 请求
  • Exprice:指定响应的过期时间,可以使代理服务器或浏览器将所加载的内容更新到缓存中,如果再次访问时,就可以直接从缓存中加载,降低服务器负载,缩短加载时间

3. 响应体

响应中最重要的当属响应体的内容,响应的正文数据都在响应体中,

比如:

  • 请求单独一个 HTML 网页时,它的响应体就是 HTML 代码
  • 请求一张图片时,它的响应体就是图片的二进制数据

在爬虫中,通常我们获得的是 HTML 代码或 JSON 数据,通过解析 HTML 代码来获取我们想要的内容。


1.3.2 Python 爬虫爬取网页流程


网络爬虫的流程主要分为以下三步:

  • 获取网页
  • 解析网页
  • 存储数据

获取网页:给一个网址发送请求,该网址就会返回网页数据,类似于在浏览器中输入一个网址后按下回车出现网页。

解析网页:从返回的页面数据中提取想要的信息。类似于在网页中找到商品的价格。

存储数据:把提取出的信息保存下来,可以保存为文件,也可以存储到数据库中。


1.3.3 Python 爬虫的技术实现


获取页面:urllib、requests(重点)selenium(重点)、多线程、登录抓取、突破 IP 封禁、IP 池、验证码识别

解析网页:re(重点)、BeautifulSoup、lxml(重点)、pyquare

存储数据:txt文件(重点)csv文件(重点)、图片文件、MySQL数据库(重点)、NoSQL 数据库

框架:Selenium、Scrapy


上次更新时间:2021/12/14

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值