互联网的大数据时代的来临,网络爬虫也成了互联网中一个重要行业,它是一种自动获取网页数据信息的爬虫程序,是网站搜索引擎的重要组成部分。通过爬虫,可以获取自己想要的相关数据信息,让爬虫协助自己的工作,进而降低成本,提高业务成功率和提高业务效率。
本文一方面从爬虫与反反爬的角度来说明如何高效的对网络上的公开数据进行爬取,另一方面也会介绍反爬虫的技术手段,为防止外部爬虫大批量的采集数据的过程对服务器造成超负载方面提供些许建议。
爬虫指的是按照一定规则自动抓取万维网信息的程序,本次主要会从爬虫的技术原理与实现,反爬虫与反反爬虫两个方面进行简单的介绍,介绍的案例均只是用于安全研究和学习,并不会进行大量爬虫或者应用于商业。
一、爬虫的技术原理与实现
1.1 爬虫的定义
爬虫分为通用爬虫和聚焦爬虫两大类,前者的目标是在保持一定内容质量的情况下爬取尽可能多的站点,比如百度这样的搜索引擎就是这种类型的爬虫,如图 1 是通用搜索引擎的基础架构:
-
首先在互联网中选出一部分网页,以这些网页的链接地址作为种子 URL;
-
将这些种子 URL 放入待抓取的 URL 队列中,爬虫从待抓取的 URL 队列依次读取;
-
将 URL 通过 DNS 解析,把链接地址转换为网站服务器对应的 IP 地址;
-
网页下载器通过网站服务器对网页进行下载,下载的网页为网页文档形式;
-
对网页文档中的 URL 进行抽取,并过滤掉已经抓取的 URL;
-
对未进行抓取的 URL 继续循环抓取,直至待抓取 URL 队列为空。
爬虫通常从一个或多个 URL 开始,在爬取的过程中不断将新的并且符合要求的 URL 放入待爬队列,直到满足程序的停止条件。
而我们日常见到的爬虫基本为后者,目标是在爬取少量站点的情况下尽可能保持精准的内容质量。典型的比如图 2 抢票软件所示,就是利用爬虫来登录售票网络并爬取信息,从而辅助商业。
了解了爬虫的定义后,那么应该如何编写爬虫程序来爬取我们想要的数据呢。我们可以先了解下目前常用的爬虫框架,因为它可以将一些常见爬虫功能的实现代码写好,然后留下一些接口,在做不同的爬虫项目时,我们只需要根据实际情况,手写少量需要变动的代码部分,并按照需要调用这些接口,即可以实现一个爬虫项目。
1.2 爬虫框架介绍
常用的搜索引擎爬虫框架如图 3 所示,首先 Nutch 是专门为搜索引擎设计的爬虫,不适合用于精确爬虫。Pyspider 和 Scrapy 都是 python 语言编写的爬虫框架,都支持分布式爬虫。另外 Pyspider 由于其可视化的操作界面,相比 Scrapy 全命令行的操作对用户更加友好,但是功能不如 Scrapy 强大。
1.3 爬虫的简单示例
除了使用爬虫框架来进行爬虫,也可以从头开始来编写爬虫程序,步骤如图 4 所示:
接下来通过一个简单的例子来实际演示上述的步骤,我们要爬取的是某应用市场的榜单,以这个作为例子,是因为这个网站没有任何的反爬虫手段,我们通过上面的步骤可以轻松爬取到内容。
网页与其对应的源代码如图 5 所示,对于网页上的数据,假定我们想要爬取排行榜上每个 app 的名称以及其分类。
我们首先分析网页源代码,发现可以直接在网页源代码中搜索到“抖音”等 app 的名称,接着看到 app 名称、app 类别等都是在一个<li>标签里,所以我们只需要请求网页地址,拿到返回的网页源代码,然后对网页源代码进行正则匹配,提取出想要的数据,保存下来即可,如图 6 所示。
#获取网页源码
def get_one_page(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
#正则匹配提取目标信息并形成字典
def parse_one_page(html):
pattern = re.compile('<li>.*?data-src="(.*?)".*?<h5>.*?det.*?>(.*?)</a>.*?p.*?<a.*?>(.*?)</a>.*?</li>',re.S)
items = re.findall(pattern, html)
j = 1
for item in items[:-1]:
yield {'index': str(j),
'name': item[1],
'class':item[2]
}
j = j+1
#结果写入txt
def write_to_file(content):
with open(r'test.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False)+'\n')
二、反爬虫相关技术
在了解具体的反爬虫措施之前,我们先介绍下反爬虫的定义和意义,限制爬虫程序访问服务器资源和获取数据的行为称为反爬虫。爬虫程序的访问速率和目的与正常用户的访问速率和目的是不同的,大部分爬虫会无节制地对目标应用进行爬取,这给目标应用的服务器带来巨大的压力。爬虫程序发出的网络请求被运营者称为“垃圾流量”。开发者为了保证服务器的正常运转或降低服务器的压力与运营成本,不得不使出各种各样的技术手段来限制爬虫对服务器资源的访问。
所以为什么要做反爬虫,答案是显然的,爬虫流量会提升服务器的负载,过大的爬虫流量会影响到服务的正常运转,从而造成收入损失