作者 Airy
本文转自AiryData,转载需授权
上一篇我们学习了数据采集中一个页面跳转到另一个页面的简单爬虫,虽然获取了这些链接数据,但是由于链接数目太多,不好查看,所以我们要想办法存储起来。
这里使用 MySQL 进行数据存储,关于 MySQL 的使用,以及使用 Python 操作 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
|