首页 存档 技术 查看内容

Python实现“维基百科六度分隔理论“之基础爬虫

2018-3-30 13:00 |来自: 互联网 373 0

摘要: 戳蓝字关注我们! 作者 Airy 本文转自AiryData,转载需授权 前 言 上一篇我们学习了数据采集中一个页面跳转到另一个页面的简单爬虫,虽然获取了这些链接数据,但是由于链接数目太多,不好查看,所以我们要想办法存 ...

戳蓝字关注我们!

作者 Airy

本文转自AiryData,转载需授权


前 言


上一篇我们学习了数据采集中一个页面跳转到另一个页面的简单爬虫,虽然获取了这些链接数据,但是由于链接数目太多,不好查看,所以我们要想办法存储起来。


这里使用 MySQL 进行数据存储,关于 MySQL 的使用,以及使用 Python 操作 MySQL,在我之前的文章中都有提到。


MySQL 中的“六度空间游戏”


前面我们已经建立了网络爬虫来采集网页,今天我们要把采集到的信息用数据库存储起来,方便后面进行数据分析。MySQL 基础知识,在我之前的文章中说的已经很多了,这里不再赘述,默认同学已经了解了 MySQL。


为了确定最合理的信息存储方式,我们要先想一下我们的处理规则。一个链接可以轻易地把页面 A 连接到页面 B,就像百度搜索,搜出来的结果就可以链接到我的网站。同样也可以把页面 B 连接到页面 A,我只需要把百度的网址插入到这篇文章就可以,不过这就是另一条链接了。所以我们可以这样识别一个链接:即“页面A存在一个链接,可以连接到页面B” 。也就是说,INSERT INTO links(fromPageId, toPageId) VALUES(A, B) ;其中 A 和 B 分别表示页面的 ID 号。


这里我们设计一个带有两张数据表的数据库来分别存储页面和链接,两张表都带有创建时间和独立的 ID 号,代码如下:


CREATETABLE`wiki`.`pages`(
`id`INTNOTNULLAUTO_INCREMENTCOMMENT'自增id,主键',
`url`VARCHAR(255)NOTNULL,
`created`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,
PRIMARYKEY(`id`)

);

CREATETABLE`wiki`.`links`(
`id`INTNOTNULLAUTO_INCREMENTCOMMENT'自增id,主键',
`fromPageId`INTNULL,
`toPageId`INTNULL,
`created`TIMESTAMPNOTNULLDEFAULTCURRENT_TIMESTAMP,
PRIMARYKEY(`id`)
);


需要注意的是,这里我没有创建标题字段,因为,一般情况下,只有点击链接进去才能看到网页标题,不过对于维基百科来说还好,wiki 的词条链接和对应的页面标题直接转换一下就可以,例如 en.wikipedia.org/wiki/Monty_Python 的后面就是页面标题 Monty Python。


下面我们来写一下把“贝肯数”(一个页面与凯文贝肯词条页面的链接数)不超过 6 的维基百科页面存储起来。


fromurllib.requestimporturlopen
frombs4importBeautifulSoup
importre
importpymysql
#连接时,密码要换成自己的
conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='****xx',db='wiki',charset='utf8mb4')

cur=conn.cursor()
#cur.EⅩEcute("USE wiki")

definsertPageIfNotExists(url):
cur.execute("SELECT * FROM pages WHERE url = %s",(url))
ifcur.rowcount==0:
cur.execute("INSERT INTO pages (url) VALUES (%s)",(url))
conn.commit()
returncur.lastrowid
else:
returncur.fetchone()[0]

definsertLink(fromPageId,toPageId):
cur.execute("SELECT * FROM links WHERE fromPageId = %s AND toPageId = %s",(int(fromPageId),int(toPageId)))
ifcur.rowcount==0:
cur.execute("INSERT INTO links (fromPageId, toPageId) VALUES(%s, %s)",(int(fromPageId),int(toPageId)))
conn.commit()

pages=set()
defgetLinks(pageUrl,recursionLevel):
globalpages
ifrecursionLevel

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部