每天都要上网,看到有用的数据你想收集起来吗?想的话那就来看看下面这种方法吧——爬虫
什么是爬虫?
- 爬虫:一段自动抓取互联网信息的程序。
- TA可以从一个URL出发,访问所有的URL。并且可以从每个页面上提取我们需要的价值数据。
- 自动发现目标数据——自动下载——自动解析——自动存储。
那么爬虫技术有什么价值呢?
- 价值——夸张的说就是:" 互联网数据,为我所用 "!
- 互联数据可以被更好的二次、三次甚至无限使用
简单爬虫框架
-
爬虫调度端
-
URL管理器
-
网页下载器(例如:urllib2)
-
网页解析器(例如:BeautifulSoup)
-
数据存储器
运行原理
1. 首先,调度器问URL管理器:是否有待爬取的URL?
2. 然后,URL管理器回复调度器:是/否
3. 接下来,调度器通知URL管理器:获取一个待爬取的URL
4. 接下来,调度器通知下载器:请下载URL的内容,下载好后给我
5. 接下来,调度器通知解析器:请解析URL内容,解析好后返回给我
6. 最后,调度器通知存储器:请将我给你的数据保存好
Python 简单爬虫框架程序(部分)
爬虫调度端
原理
- 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
- 聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。
- 另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
URL管理器
- 添加单个url
- 判断数组中是否有新的未爬取url
- 获取新的url
- 添加批量urls
网页下载器(urllib2)
###抓取策略
深度优先遍历策略
- 指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。
宽度优先遍历策略
- 基本思路是,将新下载网页中发现的链接直接**待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。还是以上面的图为例:
反向链接数策略
- 指一个网页被其他网页链接指向的数量。反向链接数表示的是一个网页的内容受到其他人的推荐的程度。因此,很多时候搜索引擎的抓取系统会使用这个指标来评价网页的重要程度,从而决定不同网页的抓取先后顺序。
Partial PageRank策略
- 该策略借鉴了PageRank算法的思想:对于已经下载的网页,连同待抓取URL队列中的URL,形成网页集合,计算每个页面的PageRank值,计算完之后,将待抓取URL队列中的URL按照PageRank值的大小排列,并按照该顺序抓取页面。
OPIC策略策略
- 该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始现金(cash)。当下载了某个页面P之后,将P的现金分摊给所有从P中分析出的链接,并且将P的现金清空。对于待抓取URL队列中的所有页面按照现金数进行排序。
大站优先策略
- 对于待抓取URL队列中的所有网页,根据所属的网站进行分类。对于待下载页面数多的网站,优先下载。这个策略也因此叫做大站优先策略。
本实例使用的深度优先遍历策略
网页解析器(BeautifulSoup)
要考虑的问题:对网页或数据的分析与过滤模式?
- 本实例应用网页中抽取的标签和class 为节点来抽取数据
#<dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>
title_node=soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find("h1")
res_data['title'] = title_node.get_text()
#<div class="lemma-summary" label-module="lemmaSummary">
summary_node = soup.find("div",class_="lemma-summary")
res_data['summary'] = summary_node.get_text()
数据存储器
- 主要是用来存储网页中下载下来的数据记录的容器,并提供生成索引的目标源。中大型的数据库产品有:Oracle、Sql Server等。
- 我们使用的是html生成器
def output_html(self):
fout = open('output.html','w')
fout.write("<html><meta charset=\"utf-8\" />")
fout.write("<body>")
fout.write("< >")
for data in self.datas:
fout.write("<tr>")
fout.write("<td>%s</td>" % data['url'])
fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
fout.write("<td>%s</td>" % data['summary'].encode('utf-8'))
fout.write("</tr>")
fout.write("</table>")
fout.write("</body>")
fout.write("</html>")
fout.close()
页面试用总结
- 这只是一个简单的爬虫,如果想深入使用,还需要解决登录、验证码、Ajax、服务器等各种问题。有待下次分享。
下面是试用结果的图片