手机应用url抓取

706次阅读
没有评论

爬虫,也叫网络爬虫或网络蜘蛛,主要的功能是下载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页面的链接。 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页面。

手机应用url抓取

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

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

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 aList = findall(‘]*>’,htmlStr)result = []# 对a节点列表进行迭代 for a in aList: # 利用正则表达式从a节点中提取出href属性的值,如中的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访问该页面。

抓取的效果如下图所示。

手机应用url抓取

 

李宁老师的《Python爬虫技术》一书预计2019-12月初出版,这本书是《Python从菜鸟到高手》的延续版本,主要介绍了Python爬虫的核心技术。超过20个完整爬虫案例。  


神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-25发表,共计2589字。
新手QQ群:570568346,欢迎进群讨论 Python51学习