Die Linkstruktur des Webs ist ein großes Netzwerk, das Sie problemlos abspielen können. Wiederholtes Abrufen der verknüpften URL aus HTML mit "urllib" und "BeautifulSoup", um eine Adjazenzmatrix für Webseiten zu erstellen. Es kann mehr als 12 Stunden dauern, also versuchen Sie es bitte mit Ihrem Herzen. Quellcode usw. sind auf Author GitHub verfügbar. Die Analyse mit NetworkX wird unter Netzwerkanalyse ist eine Linkstruktur im Web beschrieben.
import.py
from urllib.request import urlopen
from bs4 import BeautifulSoup
import networkx as nx
from tqdm import tqdm_notebook as tqdm
import numpy as np
import pandas as pd
pd.options.display.max_colwidth = 500
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import re
urllib.request
Eine Bibliothek, die Daten auf einer Website abruft
(Es gibt keine gute Referenzseite ...)
BeautifulSoup
Modul, das HTML-Dateien anhand von Tag-Informationen analysiert
Referenz: Qiita: Schöne Suppe in 10 Minuten
networkx
Netzwerkanalysemodul.
Wird im nächsten Artikel erklärt.
tqdm
Setzen Sie einen Fortschrittsbalken mit der Anweisung "for".
Beachten Sie bei der Verwendung von jupyter notebook, dass tqdm_notebook
importiert wird.
Referenz: Qiita: Fortschrittsbalken im Jupyter-Notizbuch löschen
pd.options.display.max_colwidth = 500
Erhöhen Sie in "Pandas" die maximale Breite jeder Spalte.
Lassen Sie keine sehr langen URLs aus.
url_prepare.py
start_url = "https://zozo.jp/"
# the page to begin with
explore_num = 2
# how many times do you explore new links
url_list = [start_url]
# list of the URL of all the pages. The components will be added.
link_list=[]
# list of lists [out_node, in_node]. The components will be added.
#prepare a file name to save figures and csv files
fname = re.split('[/.]', start_url)
if fname[2]=="www":
fname = fname[3]
else:
fname = fname[2]
start_url
Geben Sie die Seite an, die dem Link folgen soll.
explore_num
Geben Sie an, wie oft Sie dem Link folgen möchten (wie oft Sie am kürzesten von der Startseite aus gehen können).
url_list
Ein Array, in dem alle URLs der von Ihnen besuchten Websites gespeichert sind.
Entspricht dem Index der später benachbarten Matrix.
link_list
Ein Array, in dem alle URL-Linkpaare gespeichert sind.
Ein Array von Arrays, deren Elemente "[URL, an der der Link ausgeht, URL, an der der Link eingeht]" sind.
Entspricht jedem Element der nachfolgenden benachbarten Matrix.
fname
Der Dateiname zum späteren Speichern der Diagrammdaten "Seaborn" und "Pandas".
Das Folgende ist die Funktion, die tatsächlich dem Link folgt.
link_explore
ist eine Funktion, die alle Links durchsucht. Nimmt ein Array von URLs zur Suche als Argument.
link_cruise
ist eine Funktion, die nur nach Links zu einer bestimmten Site sucht. Nimmt eine benachbarte Matrix als Argument.
link_explore.py
def link_explore(link_list, url_list, now_url_list):
# link_list: list of the URL of all the pages
# url_list: list of lists [out_node, in_node]
# next_url_list: list of the URL to explore in this function
print(f"starting explorting {len(now_url_list)} pages")
next_url_list=[]
for url in now_url_list:
try:
with urlopen(url, timeout=10) as res:
html = res.read().decode('utf-8', 'ignore')
soup = BeautifulSoup(html, "html.parser")
except:
print("x", end="")
continue
#print(f"\n{url}")
else:
for a in soup.find_all("a"):
link = a.get("href")
if link!=None and len(link)>0:
if link[0]=="/":
link = url+link[1:]
if link[0:4] == "http":
if link[-1]=="/":
next_url_list.append(link)
link_list.append([url,link])
print("o", end="")
next_url_list = list(set(next_url_list))
url_list += next_url_list
url_list = list(set(url_list))
return link_list, url_list, next_url_list
link_cruise.py
def link_cruise(adj, url_list, now_url_list):
# adj: adjacency matrix
# next_url_list: list of the URL to explore in this function
#print(f"starting cruising {len(now_url_list)} pages")
next_url_list=[]
for url in tqdm(now_url_list):
try:
with urlopen(url, timeout=10) as res:
html = res.read().decode('utf-8', 'ignore')
soup = BeautifulSoup(html, "html.parser")
except:
continue
else:
for a in soup.find_all("a"):
link = a.get("href")
if link!=None and len(link)>0:
if link[0]=="/":
link = url+link[1:]
if link[0:4] == "http":
if link[-1]=="/":
if link in url_list:
if adj[url_list.index(url),url_list.index(link)] == 0:
next_url_list.append(link)
adj[url_list.index(url),url_list.index(link)] = 1
#print("o", end="")
next_url_list = list(set(next_url_list))
#print("")
return adj, next_url_list
Folgen Sie dem Link so oft, wie von "Explore_Num" angegeben. Zeigen Sie "o" an, wenn die verknüpfte HTML-Dekodierung erfolgreich ist, und zeigen Sie "x" an, wenn dies fehlschlägt.
explore_exe.py
next_url_list = url_list
for i in range(explore_num):
print(f"\nNo.{i+1} starting")
link_list, url_list, next_url_list = link_explore(link_list, url_list, next_url_list)
print(f"\nNo.{i+1} completed\n")
↓ Es sieht so aus ↓.
Erstellen Sie eine benachbarte Matrix.
make_adj.py
adj = np.zeros((len(url_list),len(url_list)))
for link in tqdm(link_list):
try:
adj[url_list.index(link[0]),url_list.index(link[1])] = 1
except:
pass
Die Suche nach "Explore_Num" ist auf Seiten beschränkt, die bereits besucht wurden. Wiederholen Sie die Suche, bis alle Seiten besucht sind.
cruise_exe.py
while (len(next_url_list)>0):
adj, next_url_list = link_cruise(adj, url_list, next_url_list)
Recommended Posts