网络爬虫部分基础知识分享

随着网络的蓬勃发展,万维网成为大量信息的载体,如何有效提取并利用这些信息成为一
个巨大的挑战。网络爬虫作为一种自动采集数据技术,凭借自身强大的自动提取网页数据
的能力,成为当下互联网高效、灵活地收集数据的解决方案之一。本章主要对网络爬虫的
基础知识进行详细地讲解。

声明:内容图片来源于教师课件,请勿商用转载。

1:认识爬虫

(1)什么是网络爬虫:

网络爬虫(Web Crawler)又称网络蜘蛛、网络机器人,它是一种按照一定规则,自动浏览万维网的程序或脚本。通俗地讲,网络爬虫就是一个模拟真人浏览万维网行为的程序,这个程序可以代替真人自动请求万维网,并接收从万维网返回的数据。与真人浏览万维网相比,网络爬虫能够浏览的信息量更大,效率也更高。

网络爬虫历经几十年的发展,技术变得更加多样化,并结合不同的需求衍生出类型众多的网
络爬虫。网络爬虫按照系统结构和实现技术大致可以分为4种类型,分别是通用网络爬虫
聚焦网络爬虫增量式网络爬虫深层网络爬虫

网络爬虫分类:

通用网络爬虫通用网络爬虫(General Purpose Web Crawler)又称全网爬虫(Scalable WebCrawler),是指访问全互联网资源的网络爬虫。通用网络爬虫是“互联网时代”早期出现的传统网络爬虫,它是搜索引擎(如百度、谷歌、雅虎等)抓取系统的重要组成部分,主要用于将互联网中的网页下载到本地,形成一个互联网内容的镜像备份。

聚焦网络爬虫:聚焦网络爬虫(Focused Crawler)又称主题网络爬虫(Topical Crawler),是指有选择性地访问那些与预定主题相关网页的网络爬虫,它根据预先定义好的目标,有选择性地访问与目标主题相关的网页,获取所需要的数据。与通用网络爬虫相比,聚焦网络爬虫只需要访问与预定主题相关的网页,这不仅减少了访问和保存的页面数量,而且提高了网页的更新速度,可见,聚焦网络爬虫在一定程度度节省了网络资源,能满足一些特定人群采集特定领域数据的需求。

增量式网络爬虫:增量式网络爬虫(Incremental Web Crawler)是指对已下载的网页采取增量式更新,只抓取新产生或者已经发生变化的网页的网络爬虫。增量式网络爬虫只会抓取新产生的或内容变化的网页,并不会重新抓取内容未发生变化的网页,这样可以有效地减少网页的下载量,减少访问时间和存储空间的耗费,但是增加了网页抓取算法的复杂度和实现难度。

深层网络爬虫:深层网络爬虫(Deep Web Crawler)是指抓取深层网页的网络爬虫,它要抓取的网页层次比较深,需要通过一定的附加策略才能够自动抓取,实现难度较大。

表层网页与深层网页:

网页按存在方式可以分为表层网页(Surface Web)和深层网页(Deep
Web),关于这两类网页的介绍如下。

●表层网页是指传统搜索引擎可以索引的页面,主要以超链接可以到达的静
态网页构成的网页。
●深层网页是指大部分内容无法通过静态链接获取的,只能通过用户提交一
些关键词才能获取的网页,如用户注册后内容才可见的网页。

(2)网络爬虫的应用场景:

随着互联网信息的“爆炸”,网络爬虫渐渐为人们所熟知,并被应用到了社会生活的众多
领域。作为一种自动采集网页数据的技术,很多人其实并不清楚网络爬虫具体能应用到什
么场景。事实上,大多数依赖数据支撑的应用场景都离不开网络爬虫,包括搜索引擎、舆
情分析与监测、聚合平台、出行类软件等。

网络爬虫的应用场景:

搜索引擎:搜索引擎是通用网络爬虫最重要的应用场景之一,它会将网络爬虫作为最基础的部分 -- 互联网信息的采集器,让网络爬虫自动到互联网中抓取数据。例如,谷歌、百度、必应等搜索引擎都是利用网络爬虫技术从互联网上采集海量的数据。

舆情分析与监测:政府或企业通过网络爬虫技术自动采集论坛评论、在线博客、新闻媒体或微博等网站中的海量数据,采用数据挖掘的相关方法(如词频统计、文本情感计算、主题识别等)发掘舆情热点,跟踪目标话题,并根据一定的标准采取相应的舆情控制与引导措施。例如,百度热点排行榜、微博热搜排行榜

聚合平台:如今出现的很多聚合平台,如返利网、慢慢买等,也是网络爬虫技术的常见的应用场景,这些平台就是运用网络爬虫技术对一些电商平台上的商品信息进行采集,将所有的商品信息放到自己的平台上展示,并提供横向数据的比较,帮助用户寻找实惠的商品价格。例如,用户在慢慢买平台搜索华为智能手表后,平台上展示了很多款华为智能手表的价格分析及价格走势等信息。

出行类软件:出行类软件,比如飞猪、携程、去哪儿等,也是网络爬虫应用比较多的场景。这类应用运用网络爬虫技术,不断地访问交通出行的官方售票网站刷新余票,一旦发现有新的余票便会通知用户付款买票。不过,官方售票网站并不欢迎网络爬虫的这种行为,因为高频率地访问网页极易造成网站出现瘫痪的情况。

(3)网络爬虫的工作流程和原理:

不同的爬虫,工作原理不同,通用网络爬虫的采集目标是整个互联网上的所有网页,它会从一个或多个初始URL开始,获取初始URL对应的网页数据,并不断从该网页数据中抽取新的URL放到队列中,直至满足一定的条件后停止。

聚焦网络爬虫面向有特殊需求的人群,它会根据预先设定的主题顺着某个垂直领域进行抓取,而不是漫无目的地随意抓取。与通用网络爬虫相比,聚焦网络爬虫会根据一定的网页分析算法对网页进行筛选,保留与主题有关的网页链接,舍弃与主题无关的网页链接,其目的性更强。

以上就是部分网络爬虫的工作流程和原理,接下来我们看一下网络爬虫抓取网页的流程:

1:选择一些网页,将这些网页的链接作为种子URL放入待抓取 URL队列中。

2:从待抓取URL 队列中依次读取URL。

3:通过DNS解析URL,把URL地址转换为网站服务器所对应的IP地址。

4:将IP地址和网页相对路径名称交给网页下载器,网页下载器负责网页内容的下载。

5:网页下载器将相应网页的内容下载到本地。

6:将下载到本地的网页存储到页面库中,同时将使用过的URL放入到已抓取的URL队列中,避免重复抓取。

7:对于刚下载的网页中抽取出所包含的URL信息。

8:在已抓取URL队列中检查抽取的URL是否被下载过。如果它还未被下载过,则将这个URL放入待抓取URL队列中。如此重复2~8,直到待抓取URL队列为空。

2:网页请求原理

(1)浏览器加载网页的过程:

1:浏览器通过域名系统(DomainNameSystem,DNS)服务器查找百度服务器对应的IP地址。

2:浏览器向IP地址对应的Web服务器发送HTTP请求。

3:Web 服务器接收 HTTP 请求后进行处理,向浏览器返回HTML页面。

4:浏览器对HTML 页面进行渲染呈现给用户。

(2)HTTP基础:

对于网络爬虫来说,它采集的页面通常使用的是HTTP协议和HTTPS协议。

HTTP协议全称为超文本传输协议(Hyper Text  Transfer Protocol),它用于将Web服务器的超文本资源传送到浏览器中。HTTP 协议能够高效、准确地传送超文本资源,但浏览器与Web服务器的连接是一种一次性连接,它限制每次连接只能处理一个请求。这意味着每个请求都是独立的,服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。

HTTPS 协议全称为超文本传输安全协议(Hyper  Text Transfer Protocol Secure),该协议在HTTP 协议基础上添加了安全套接字协议(Secure Sockets Layer,SSL),数据在传输过程中主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

HTTP请求格式:

浏览器向Web 服务器发送的信息是一个HTTP请求,每个HTTP请求由请求行、请求头部、空行以及请求数据(有的也称为请求体)这4个部分组成。

请求行:

在请求行中,GET表示向服务器请求网络资源时所使用的请求方法,/item/Python/
407313表示请求的URL地址,HTTP/1.1表示使用的HTTP版本。

常用的请求方法包括GET和POST,其中GET用于请求服务器发送某个资源,POST用于向服务器提交表单或上传文件,表单数据或文件的数据会包含在请求体中。请求方法GET和POST的区别主要体现两个方面。

请求头:

请求行紧挨的部分就是若干个请求头信息,请求头主要用于说明服务器要使用的附加信息。

HTTP 响应格式:

Web服务器发送给浏览器的响应信息由4个部分组成,分别是状态行、响应头、空行、以及响应正文。

状态行:

在状态行中,HTTP/1.1表示HTTP协议的版本号,200表示响应状态码,OK表示响应状态码的简短描述。

响应状态码代表服务器的响应状态,它的作用是告知浏览器请求Web资源的结果,如请求成功、请
求异常、服务器处理错误等。

响应头:

状态行下面的部分便是若干个响应头信息,关于响应头中的常用字段以及常用值的介绍如下。

响应正文:

响应正文是服务器返回的具体数据,常见的数据是HTML源代码。浏览器在接收到HTTP响应后,会根据响应正文的不同类型进行不同的处理。如果响应正文是DOC文档,这时浏览器会借助安装在本机的Word程序打开这份文档;如果响应正文是RAR压缩文档,这时浏览器会弹出一个下载窗口让用户下载解压软件;如果响应正文是HTML文档,这时浏览器会在自身的窗口中展示该文档。

除去HTTP请求网页方法,还有其他的请求方法,这里就不做多赘叙。

3:网页爬取中需要用到部分的库

(1)urllib库:

抓取网页数据使用urllib库,urllib库是 Python内置的HTTP请求库,它可以看做是处理URL的组件集合。

使用urllib快速爬取itcast网页,示例,附上示例结果:

import urllib.request
#调用urllib.request库的urlopen 方法,并传入一个 url
response =
urllib.request.urlopen('http://www.baidu.com')
# 使用read 方法读取获取到的网页内容
html = response.read().decode('UTF-8')
# 打印网页内容
print(html)

快速使用urllib爬取网页,Python2中使用的是urllib2库来下载网页,该库的用法如下所示:

import urllib2
response = urllib2.urlopen('http://www.baidu.com')

值得注意的是,Python3出现后,之前Python2中的urllib2库被移到了urllib.request模块中,之前urllib2中很多函数的路径也发生了变化。

(2)分析 urlopen 方法

前面在爬取网页时,有一句核心的爬虫代码:

response = urllib.request.urlopen('http://www.baidu.com')

上述代码调用的是urllib. request 模块中的urlopen方法,它传入了一个百度首页的URL,使用的协议是HTTP,这是urlopen方法最简单的用法。

urlopen方法可以接收多个参数,定义格式如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,
capath=None, cadefault=False, context=None)

参数如下:
<1>url -- 表示目标资源在网站中的位置。

<2>data -- 用来指明向服务器发送请求的额外信息。

<3>timeout -该参数用于设置超时时间,单位是秒。

<4>context -实现SSL加密传输,该参数很少使用。

上面将urlopen方法做个简略描述,除了以上参数,urlopen 方法还有一些其他的用法。例如,可以通过指定headers参数来发送HTTP请求头。可以通过指定 method参数来指定请求方法。可以通过指定 proxies 参数来设置代理服务器。可以通过指定 verify 参数来验证服务器的证书。可以通过指定cert参数来指定客户端的证书。感兴趣的同学可以去寻找详细资料来研究一下。

除此之外要爬取到网页,还需要使用urllib实现数据传输,设置代理服务器,超时设置和常见的网络异常等,由于过于繁琐,这里就不一一进行详解,建议同学们在专业人士指导或专业软件下自行进行单个模块的学习,方便理解和学习。

(2)requests库:

静态网页是早期网站中经常用到的页面,这类网页的特点是所有数据都直接呈现在网页源代码中,对于网络爬虫来说,只要获取了静态网页的源代码,就相当于抓取了静态网页的数据。本章将针对抓取静态网页数据的相关内容进行详细地讲解。

静态网页是HTML格式的网页,这种网页在浏览器中呈现的内容都会体现在源代码中,此时我们若要抓取静态网页的数据,只需要获得网页的源代码即可。

网络爬虫抓取静态网页数据的过程就是获得网页源代码的过程,这个过程模仿用户通过浏览器访问网页的过程,包括向Web服务器发送HTTP请求、服务器对HTTP请求做出响应并返回网页源码。

为帮助开发人员抓取静态网页数据,减少开发人员的开发时间,Python提供了一些功能齐全的库,包括urllib、urllib3和Requests,其中urllib是Python内置库,无须安装便可以直接在程序中使用;urllib3和Requests都是第三方库,需要另行安装后才可以在程序中使用。

选择用Requests 库进行开发,截至2021年9月,Requests库的最新版本是2.25.1。值得一提的是,Requests库是第三方库,它可以通过pip工具进行安装,如此便可以在导入程序后直接使用。Requests库的安装命令如下。

发送GET请求

在Requests库中,GET请求通过调用get()函数发送,该函数会根据传入的URL构建一个请求
(每个请求都是Request类的对象),将该请求发送给服务器。get()函数的声明如下:

get(url, params=None, headers=None, cookies=None,
                        verify=True, proxies=None, timeout=None, ** kwargs)

●url:必选参数,表示请求的URL。

●params:可选参数,表示请求的查询字符串。

●headers:可选参数,表示请求的请求头,该参数只支持字典类型的值。

●cookies:可选参数,表示请求的Cookie信息,该参数支持字典或CookieJar类对象

●verify:可选参数,表示是否启用SSL证书,默认值为True。

●proxies:可选参数,用于设置代理服务器,该参数只支持字典类型的值。

●timeout:可选参数,表示请求网页时设定的超时时长,以秒为单位。

使用get()函数可以发送不携带url参数和携带url参数的GET请求。

若GET请求的URL中不携带参数,我们在调用get()函数发送GET请求时只需要给 url参数传入指定的URL即可,不携带url参数的GET请求;

import requests
# 准备 URL
base_url = 'https://www.baidu.com/'
# 根据URL构造请求,发送GET请求,接收服务器返回的响应信息
response = requests.get(url=base_url)
#查看响应码
print(response.status_code)

若GET请求的URL中携带参数,在调用get()函数发送GET请求时只需要给 url参数传入指定的
URL即可,携带 url参数的 GET请求;

import requests
base_url = 'https://www.baidu.com/s'
wd_params = {'wd': 'python'}
#根据URL构造请求,发送GET请求,接收服务器返回的响应
response = requests.get(base_url, params=wd_params)
#查看响应码
print(response.status_code)

4:尾声

最后,希望大家能在这有所收获。以及,如果学会网络爬虫,要遵守相关协议,也不要乱爬取信息,不然可能会出现以下情况,

哈哈哈,祝大家顺心顺意(^_^)!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值