预备阅读: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实现“维基百科六度分隔理论“之基础爬虫相关推荐

  1. 什么是社会性网络?什么是六度分隔理论?

    2007年05月23日 星期三 下午 03:13 根据维基百科的解释,"社会网络(Social Networking:SN)"是指个人之间的关系网络. 据一些不系统的分析,社会网络 ...

  2. 小世界效应:从凯文·贝肯到六度分隔理论(1)

    斯坦福的老师很喜欢用一些生活的小案例来引入课题,小的Project也不例外. 凯文·贝肯是好莱坞的大牌明星,这次Project也得从他说起.虽然贝肯在娱乐圈可谓呼风唤雨,人气也是相当的高,但他与奥斯卡 ...

  3. python 维基百科爬虫_如何使用Python提取维基百科数据

    python 维基百科爬虫 这是本教程的可视版: 我需要指出的是,我们不会手动抓取Wikipedia页面, Wikipedia模块已经为我们完成了艰巨的工作. 让我们安装它: pip3 install ...

  4. python爬网站的题库_Python零基础爬虫教程(实战案例爬取电影网站资源链接)

    前言 好像没法添加链接,文中的链接只能复制到浏览器查看了 这篇是我写在csdn的,那里代码格式支持更好,文章链接 https://blog.csdn.net/d497465762/article/de ...

  5. 【Python爬虫】Python网络爬虫案例:维基百科

    Python网络爬虫案例:维基百科 1.项目描述 本案例的目标是爬取维基百科上的词条连接.爬虫深度设置为两层. 网络蜘蛛:是通过网页的链接地址寻找网页的,从网站某一个页面(通常是首页)开始读取网页的内 ...

  6. 关系和纽带:六度分割理论【存疑2处】

    查资料的时候看到"六度分割理论",之前就听说过,只知道是什么意思,但没详细了解过. 维基百科上说"六度分割理论"(也叫"六度空间理论"或&q ...

  7. 从六度分隔到无尺度网络

    1. 随机网络 现在我们来思考一个关于SNS形成的问题:我的朋友是从那里来的? 大约的故事是这样的: 从前,有个叫 mxwu的小孩出生在了中国某个二线城市的小院子里.他不知道为什么上帝没有把他安排在美 ...

  8. SNS背后的科学(1)从六度分隔到无尺度网络

    http://socialbeta.com/t/the-wisdom-of-sns-part-one.html 此系列Blog连载于我的Blog和SocialBeta.欢迎各位关注SNS,社会化媒体的 ...

  9. java 维基百科_wikipedia

    popup的使用(一)2021-01-22 16:35:58 核心代码 注意Hyperlink的使用 You can use a Popup to provide a link for a speci ...

最新文章

  1. 《Visual Studio Hacks 》(十)
  2. svn: E200009
  3. 25个出众的Web表单范例
  4. 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置
  5. idea启动tomcat没有加载项目_震惊!我三步就搞定了 Tomcat 源码环境搭建!
  6. HTML滚动条自定义
  7. 鸿蒙硬件HI3861-INA226-电压测量(外挂方案)
  8. mysql 出现 quot_mysql 出现 quot;the table is fullquot;的问题 - tmuffamd - ITeye博客
  9. 机器人绳索英雄下载苹果手机_机器人绳索英雄
  10. 系统集成管理师2011下半年软考透解 四
  11. 基础课教材推荐-数字设计、体系结构
  12. springboot 嵌入式容器
  13. 深入浅出分布式系统Raft协议
  14. WPS-批量把数字转换成文本格式
  15. 卷积神经网络之“浅层特征”与“深层特征”
  16. MySQL事务隔离及锁机制
  17. 百度地图-根据经纬度定位示例-百度地图单点标注(整理)
  18. 在vmware里面免费安装纯净的xp虚拟机
  19. (二)卷积神经网络之——AlexNet
  20. hp M1005 激光打印机 通过usb接入路由器 变成网络打印机

热门文章

  1. 见缝插针小程序php,抖音小程序怎么开通
  2. dlna 交互步骤-转发
  3. CDA学习笔记--EXCEL篇
  4. 汉初百年儒家士人与地方社会
  5. 第十二章 软件壳(三)(动态加载型壳)
  6. 【机器学习】鸢尾花分类问题
  7. android 5.0 pie,Android各版本份额占比出炉:Android Pie仍未知
  8. 基于遗传算法在机器人路径规划中的应用研究(Matlab代码实现)
  9. Windows程式开发设计指南(十五)与装置无关的点阵图
  10. 奢华酒店品牌美高梅将入驻上海西岸;ClinChoice昆翎完成1.5亿美元融资 | 美通企业日报...