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中的序号