前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python爬虫:抓取整个互联网的数据

Python爬虫:抓取整个互联网的数据

作者头像
蒙娜丽宁
发布2020-04-13 11:59:25
3.1K0
发布2020-04-13 11:59:25
举报
文章被收录于专栏:极客起源极客起源

爬虫,也叫网络爬虫或网络蜘蛛,主要的功能是下载Internet或局域网中的各种资源。如html静态页面、图像文件、js代码等。网络爬虫的主要目的是为其他系统提供数据源,如搜索引擎(Google、Baidu等)、深度学习、数据分析、大数据、API服务等。这些系统都属于不同的领域,而且都是异构的,所以肯定不能通过一种网络爬虫来为所有的这些系统提供服务,因此,在学习网络爬虫之前,先要了解网络爬虫的分类。

如果从按抓取数据的范围进行分类,网络爬虫可以分为如下几类。

  • 全网爬虫:用于抓取整个互联网的数据,主要用于搜索引擎(如Google、Baidu等)的数据源。
  • 站内爬虫:与全网爬虫类似,只是用于抓取站内的网络资源。主要用于企业内部搜索引擎的数据源。
  • 定向爬虫:这种爬虫的应用相当广泛,我们讨论的大多都是这种爬虫。这种爬虫只关心特定的数据,如网页中的PM2.5实时监测数据,天猫胸罩的销售记录、美团网的用户评论等。抓取这些数据的目的也五花八门,有的是为了加工整理,供自己的程序使用,有的是为了统计分析,得到一些有价值的结果,例如,哪种颜色的胸罩卖的最好。

本文主要讲解第一类爬虫,全网爬虫的实现。

由于整个互联网的数据过于庞大,所以这里用了一些网页模拟整个互联网的页面,来模拟抓取这些页面。

这里使用7个HTML文件来模拟互联网资源,并将这7个HTML文件放在本地的nginx服务器的虚拟目录,以便抓取这7个HTML文件。

全网爬虫要至少有一个入口点(一般是门户网站的首页),然后会用爬虫抓取这个入口点指向的页面,接下来会将该页面中所有链接节点(a节点)中href属性的值提取出来。这样会得到更多的Url,然后再用同样的方式抓取这些Url指向的HTML页面,再提取出这些HTML页面中a节点的href属性的值,然后再继续,直到所有的HTML页面都被分析完为止。只要任何一个HTML页面都是通过入口点可达的,使用这种方式就可以抓取所有的HTML页面。这很明显是一个递归过程,下面就用伪代码来描述这一递归过程。

从前面的描述可知,要实现一个全网爬虫,需要下面两个核心技术。

  • 下载Web资源(html、css、js、json)
  • 分析Web资源

假设下载资源通过download(url)函数完成,url是要下载的资源链接。download函数返回了网络资源的文本内容。analyse(html)函数用于分析Web资源,html是download函数的返回值,也就是下载的HTML代码。analyse函数返回一个列表类型的值,该返回值包含了HTML页面中所有的URL(a节点href属性值)。如果HTML代码中没有a节点,那么analyse函数返回空列表(长度为0的列表)。下面的drawler函数就是下载和分析HTML页面文件的函数,外部程序第1次调用crawler函数时传入的URL就是入口点HTML页面的链接。

代码语言:javascript
复制
def crawler(url){    # 下载url指向的HTML页面html = download(url)# 分析HTML页面代码,并返回该代码中所有的URLurls = analyse(html)# 对URL列表进行迭代,对所有的URL递归调用crawler函数    for url in urls    {        crawler(url)    }}# 外部程序第一次调用crawler函数,http://localhost/files/index.html就是入口点的URLcrawler('http://localhost/files/index.html ')

下图是这7个页面的关系图,从index.html页面可以导航到任何一个html页面,所以只要从index.html开始抓取,就会抓取到所有的html页面。

从上图可以看到,b.html、aa.html、bb.html和cc.html文件中并没有a节点,所以这4个HTML文件是递归的终止条件。

下面是基于递归算法的爬虫的代码。

代码语言:javascript
复制
from urllib3 import *from re import *http = PoolManager()disable_warnings()# 下载HTML文件def download(url):result = http.request('GET', url)# 将下载的HTML文件代码用utf-8格式解码成字符串    htmlStr = result.data.decode('utf-8')    # 输出当前抓取的HTML代码    print(htmlStr)    return htmlStr# 分析HTML代码def analyse(htmlStr):    # 利用正则表达式获取所有的a节点,如<a href='a.html'>a</a>    aList = findall('<a[^>]*>',htmlStr)result = []# 对a节点列表进行迭代    for a in aList:        # 利用正则表达式从a节点中提取出href属性的值,如<a href='a.html'>中的a.html        g = search('href[\s]*=[\s]*[\'"]([^>\'""]*)[\'"]',a)        if g != None:            # 获取a节点href属性的值,href属性值就是第1个分组的值url = g.group(1)# 将Url变成绝对链接url = 'http://localhost/files/' + url# 将提取出的Url追加到result列表中            result.append(url)    return result# 用于从入口点抓取HTML文件的函数def crawler(url):    # 输出正在抓取的Urlprint(url)# 下载HTML文件html = download(url)# 分析HTML代码urls = analyse(html)# 对每一个Url递归调用crawler函数    for url in urls:        crawler(url)# 从入口点Url开始抓取所有的HTML文件crawler('http://localhost/files')

注意:本文的例子使用了nginx服务器,所以应该将本例所有的html页面放置nginx虚拟目录的files子目录下。以便可以通过http://localhost/files/index.html访问该页面。

抓取的效果如下图所示。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档