[PYTHON] Die Netzwerkanalyse ist eine Weblinkstruktur ①

Einführung

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.

Programmübersicht

  1. Geben Sie die Startseite an, die dem Link folgen soll
  2. Geben Sie an, wie oft Sie dem Link folgen sollen (wie oft Sie am kürzesten von der Startseite gehen können).
  3. Folgen Sie dem Link so oft wie angegeben
  4. Beschränken Sie alle Links auf die URLs, die Sie so oft erhalten haben
  5. Erstellen Sie eine benachbarte Matrix

Vorbereitung

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".

Funktion zur Analyse der Verbindungsstruktur

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

Lauf

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 ↓. スクリーンショット 2019-11-09 16.00.31.png


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)

Komplett!

スクリーンショット 2019-11-09 16.04.22.png

Folge

Recommended Posts

Die Netzwerkanalyse ist eine Weblinkstruktur ①
Die Netzwerkanalyse ist eine Weblinkstruktur ②
Was ist das Convolutional Neural Network?
Was ist eine Distribution?
Ordnerstruktur zur Analyse
Was ist ein Terminal?
Was ist ein Hacker?
Was ist ein Zeiger?
Was ist der Unterschied zwischen symbolischen und harten Links?
Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt
Analyse nach Bayes'schem Denken (1) ... Was ist besser, A oder B?