Python实现“维基百科六度分隔理论“之基础爬虫
预备阅读:Python的urllib高级用法 Python中Beautiful Soup的用法 Python中的正则表达式模块re
前言
前面学习了urllib和beautifulsoup来进行数据采集,相信大家都有了一些基础,如果没有,请看预备阅读,今天来做一个有趣的数据采集,就是遍历一个域名。
最近看了一下六度分隔理论,所以今天用Python来实现“六度分隔理论”的查找方法的基础部分。
六度分隔理论
所谓的“六度分隔理论”,是指世界上任意两个人要想建立联系,最多只需要通过6个人的介绍就能够实现。但根据美国社交网站Facebook最近进行的一项研究,人与人之间的联系相对于以往变得更为紧密,目前只需要4个人的就能把两个互不相识的人联系起来。
1994年,根据约翰·瓜尔(John Guare)的同名戏剧改编的电影《六度分隔》(Six Degrees OfSeparation)上映,“六度分隔理论”得以重新回在人们的视野之中。
同年,演员凯文·贝肯宣称在他漫长而丰富的职业生涯中,他和好莱坞的每一个人都合作过,并因此诞生了一个新的术语——“凯文·贝肯六度理论”。
“维基百科六度分隔理论”
上文提到了凯文·贝肯,根据资料显示,埃里克·艾德尔和布兰登·弗雷泽都出现在电影《骑警杜德雷》里面,布兰登·弗雷泽又和凯文·贝肯同时出现在电影《我呼吸的空气里》。因此,根据这两个条件,从埃里克·艾德尔到凯文·贝肯的链条主题长度只有3。
也就是说,我们要实现从埃里克·艾德尔的词条页(http://en.wikipedia.org/wiki/Eric_Idle)开始,经过最少的链接点击次数找到凯文·贝肯的词条页
(http://en.wikipedia.org/wiki/Kevin_Bacon)。
首先我们写一段获取凯文·贝肯词条页的内容的代码:
from urllib.request import urlopen from bs4 import BeautifulSouphtml = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon") soup = BeautifulSoup(html) for link in soup.findAll("a"):if 'href' in link.attrs:print (link.attrs['href'])
上面代码获取的内容会生成一系列链接,我们可以看到我们想要的所有词条链接都在里面,但是这里面页包括的我们不需要的链接,具体内容,请动手操作看一下。
一个网站的每个页面都包括了侧边栏、页眉、页脚等以及分类页面、对话页面和其他链接,维基百科也一样,这是建站的时候为了方便这样做的。
我们仔细看一下指向词条的链接(这里一般F12审查元素找一下规律),会发现它们都有三个共同点:
它们都在id是bodyContent的div标签里。
URL链接不包含冒号。
URL链接都以/wiki/开头。
下面我们用新规则来稍微调整一下代码:
from urllib.request import urlopen from bs4 import BeautifulSoup import rehtml = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon") soup = BeautifulSoup(html) for link in soup.find("div", {"id":"bodyContent"}).findAll("a", href = re.compile("^(/wiki/)((?!:).)*$")):if 'href' in link.attrs:print (link.attrs['href'])
我们运行上面的代码就可以看到维基百科上凯文·贝肯词条里所有指向其他词条的链接。
上面的代码只是获取静态页面的内容,实际意义不大,下面我们来完善一下,看一下具体需求:
一个函数getLinks,可以用维基百科词条/wiki/<词条名称>形式的URL链接作为参数,然后以同样的形式返回一个列表,里面包含所有的词条URL链接。
一个主函数,以某个起始词条为参数调用get Links,再从返回的URL列表里随机选择一个词条链接,再调用getLinks,直到我们主动停止,或者在新的页面上没有词条链接了,程序自动停止。
完整代码如下:
from urllib.request import urlopen from bs4 import BeautifulSoup import datetime import random import rerandom.seed(datetime.datetime.now()) def getLinks(articleUrl):html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")soup = BeautifulSoup(html)return soup.find("div", {"id":"bodyContent"}).findAll("a", href = re.compile("^(/wiki/)((?!:).)*$"))links = getLinks("/wiki/Kevin_Bacon") while len(links) > 0:newArticle = links[random.randint(0, len(links)-1)].attrs["href"]print (newArticle)links = getLinks(newArticle)
上面需要注意的是,导入需要的Python库之后,程序首先做的就是用系统当前时间生成一个随机数生成器,这样可以保证每次在运行程序的时候,维基百科词条的选择都是一个全新的随机路径。
其他执行过程,上面说的很详细了,一一对照即可,这里今天先把最基础的内容,构建从一个页面到另一个页面的爬虫,要解决“维基百科六度分隔理论”还有一部分要做,由于时间问题,今天只能讲到这里,更多精彩,敬请期待。
小结
这里我们重新复习了一下urllib和BeautifulSoup以及正则的用法,加深我们对之前知识的了解,提高问题解决能力,也提出了一个问题,希望感兴趣的同学可以先看看,后面还有高级内容哦。
希望通过上面的内容能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。
如果想快速联系我,欢迎关注微信公众号:AiryData。
Python实现“维基百科六度分隔理论“之基础爬虫相关推荐
- 什么是社会性网络?什么是六度分隔理论?
2007年05月23日 星期三 下午 03:13 根据维基百科的解释,"社会网络(Social Networking:SN)"是指个人之间的关系网络. 据一些不系统的分析,社会网络 ...
- 小世界效应:从凯文·贝肯到六度分隔理论(1)
斯坦福的老师很喜欢用一些生活的小案例来引入课题,小的Project也不例外. 凯文·贝肯是好莱坞的大牌明星,这次Project也得从他说起.虽然贝肯在娱乐圈可谓呼风唤雨,人气也是相当的高,但他与奥斯卡 ...
- python 维基百科爬虫_如何使用Python提取维基百科数据
python 维基百科爬虫 这是本教程的可视版: 我需要指出的是,我们不会手动抓取Wikipedia页面, Wikipedia模块已经为我们完成了艰巨的工作. 让我们安装它: pip3 install ...
- python爬网站的题库_Python零基础爬虫教程(实战案例爬取电影网站资源链接)
前言 好像没法添加链接,文中的链接只能复制到浏览器查看了 这篇是我写在csdn的,那里代码格式支持更好,文章链接 https://blog.csdn.net/d497465762/article/de ...
- 【Python爬虫】Python网络爬虫案例:维基百科
Python网络爬虫案例:维基百科 1.项目描述 本案例的目标是爬取维基百科上的词条连接.爬虫深度设置为两层. 网络蜘蛛:是通过网页的链接地址寻找网页的,从网站某一个页面(通常是首页)开始读取网页的内 ...
- 关系和纽带:六度分割理论【存疑2处】
查资料的时候看到"六度分割理论",之前就听说过,只知道是什么意思,但没详细了解过. 维基百科上说"六度分割理论"(也叫"六度空间理论"或&q ...
- 从六度分隔到无尺度网络
1. 随机网络 现在我们来思考一个关于SNS形成的问题:我的朋友是从那里来的? 大约的故事是这样的: 从前,有个叫 mxwu的小孩出生在了中国某个二线城市的小院子里.他不知道为什么上帝没有把他安排在美 ...
- SNS背后的科学(1)从六度分隔到无尺度网络
http://socialbeta.com/t/the-wisdom-of-sns-part-one.html 此系列Blog连载于我的Blog和SocialBeta.欢迎各位关注SNS,社会化媒体的 ...
- java 维基百科_wikipedia
popup的使用(一)2021-01-22 16:35:58 核心代码 注意Hyperlink的使用 You can use a Popup to provide a link for a speci ...
最新文章
- 《Visual Studio Hacks 》(十)
- svn: E200009
- 25个出众的Web表单范例
- 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置
- idea启动tomcat没有加载项目_震惊!我三步就搞定了 Tomcat 源码环境搭建!
- HTML滚动条自定义
- 鸿蒙硬件HI3861-INA226-电压测量(外挂方案)
- mysql 出现 quot_mysql 出现 quot;the table is fullquot;的问题 - tmuffamd - ITeye博客
- 机器人绳索英雄下载苹果手机_机器人绳索英雄
- 系统集成管理师2011下半年软考透解 四
- 基础课教材推荐-数字设计、体系结构
- springboot 嵌入式容器
- 深入浅出分布式系统Raft协议
- WPS-批量把数字转换成文本格式
- 卷积神经网络之“浅层特征”与“深层特征”
- MySQL事务隔离及锁机制
- 百度地图-根据经纬度定位示例-百度地图单点标注(整理)
- 在vmware里面免费安装纯净的xp虚拟机
- (二)卷积神经网络之——AlexNet
- hp M1005 激光打印机 通过usb接入路由器 变成网络打印机
热门文章
- 见缝插针小程序php,抖音小程序怎么开通
- dlna 交互步骤-转发
- CDA学习笔记--EXCEL篇
- 汉初百年儒家士人与地方社会
- 第十二章 软件壳(三)(动态加载型壳)
- 【机器学习】鸢尾花分类问题
- android 5.0 pie,Android各版本份额占比出炉:Android Pie仍未知
- 基于遗传算法在机器人路径规划中的应用研究(Matlab代码实现)
- Windows程式开发设计指南(十五)与装置无关的点阵图
- 奢华酒店品牌美高梅将入驻上海西岸;ClinChoice昆翎完成1.5亿美元融资 | 美通企业日报...