python爬虫建立网页链接图for Google矩阵

python爬虫建立网页链接图for Google矩阵

上学期数值计算的作业是爬取任意学校网站建立一个有500个页面的Google矩阵,上网找了一圈没发现有现成的,于是只能自己写了。
这里只有建立网页间链接图的代码,计算Google矩阵的代码就不贴了,感觉有错

#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
Created on 2018年12月7日
@author: Administrator
'''
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
import requests
from builtins import str
import matplotlib.pyplot as plt

startpage="http://www.hit.edu.cn/"#爬虫开始爬的页面
mainpage='http://www.hit.edu.cn/'#被爬取的网站域名
viewed=[]#访问过的URL
linklen=500#爬取的页面个数限制
linkmap=np.zeros([linklen,linklen])#网页链接关系矩阵
linksavepath='E:\作业\大三上\数值计算\实验4\\na.txt'#链接图保存路径
URLsavepath='E:\作业\大三上\数值计算\实验4\\url2.txt'#访问的页面的保存路径
def isvalidurl(url1):#判断网页能否访问
    if (len(url1)<2 or url1.find('.php')!=-1 or url1.find('javascript')!=-1 
    or url1.find('#')!=-1 or url1.find('.jpg')!=-1 or url1.find('.mp3')!=-1):
        return 0
    else:
        return 1

def refinestr(str):#剔除无法访问的网页及非网页
    global startpage
    if isvalidurl(str)==0:
        print("不合法"+str)
        return '0'
    if str.find('http:')!=-1 or str.find('https:')!=-1:
        pass
    else:
        if(str.find(startpage)!=-1):
            pass
        else:
            return startpage+str
    return str
        
def inlinkmap(url,myurl):#URL是外链的URL,myurl是本页的url
    global linkmap
    global startpage
    global viewed
    #print(url)
    if isvalidurl(url)==0:
        #print("不合法"+url)
        return 0
    else: 
        try:
            myindex=viewed.index(myurl)
            index=viewed.index(url)
            linkmap[myindex,index]=1
            #if myindex>=0 and index>=0:
            return 1
        except:
            return 0
        
def viewappend(stri):
    global viewed
    if isvalidurl(stri)==0:
        print("不合法"+stri)
    else: 
        viewed.append(stri)
    
def getalllink(url,lenth):#获取某个连接下的外链
    global linklen
    global viewed
    global linkmap 
    global startpage  
    url1=refinestr(url)
    if len(url1)>=len(startpage):
        try:
            print("访问"+url1)
            htm = requests.get(url1).content
            oup = BeautifulSoup(htm,"html.parser",from_encoding="utf-8")
            linkss = oup.find_all('a',limit=500)#找所有外链
            #print(linkss)
            valid=0
            for link in linkss:#遍历该页面外链
                if link!=None:               
                    if link.get('href')!=None :#添加外链
                        if len(viewed)<linklen:
                            if viewed.count(link['href'])>0:#有重复
                                #linklen-=1;
                                pass
                            else : 
                                viewappend(link['href'])
                                #print(link['href'])
                        tem=inlinkmap(link['href'], url)#在linkmap矩阵中建立联系
                        if tem==1:
                            valid+=1
                        
            print("解析完成:"+url1+"外链数:"+str(valid))
        except:#遇到失败的网页先保存一下现有的链接图
            print("解析失败"+url1)
            df=pd.DataFrame(linkmap)
            df.to_csv(linksavepath,index=False,header=False)

viewed.append(startpage)
print("所有连接")
getalllink(startpage, linklen)
temp=linklen
for oneurl in viewed:
    getalllink(oneurl, linklen)
    temp-=1
    print("还剩"+str(temp))
    #print(oneurl)
print(len(viewed))

plt.imshow(linkmap,interpolation='nearest',cmap='bone',origin='lower')
plt.colorbar()#显示出网页链接关系图
plt.show()

#保存链接图和对应url
#linkmap[0,:]代表url[0]的所有外链状态
#linkmap[:,0]代表所有链接到url[0]的url的序号
du=pd.DataFrame(viewed)
du.to_csv(URLsavepath,index=False,header=False)
df=pd.DataFrame(linkmap)
df.to_csv(linksavepath,index=False,header=False)

原理:先爬取startPage,将它所有的外链存入viewed列表,并在linkmap矩阵的第一行对应外链URL的位置填1。
这时viewed里面的URL数量一般不够500个。
接下来拿取viewed中的第二个URL,再次执行存入外链并填写linkmap矩阵的步骤,如果该网页的外链中存在viewed表中已有的URL,就在linkmap[该网页序号,已有的URL序号]上填1。重复执行直到viewed遍历完一次

  • 网页序号是指该URL在viewed中的序号

猜你喜欢

转载自blog.csdn.net/ardepomy/article/details/86640379
今日推荐