Pythonはホームページの内外チェーンのコードをすべて取得します。


プロジェクト紹介
広さ優先検索方法を用いて、ウェブサイト上のすべての外部チェーンを取得する。
まず、私達は1つのホームページに入り、ウェブページのすべての内部チェーンと外部チェーンを取得し、それぞれ内部チェーンに入り、その内チェーンのすべての内チェーンと外チェーンを取得します。
コードアウトライン
1、クラスで一つの列を定義し、先に出て、チームの最後に入隊し、チームの先頭から出る;
2、4つの関数を定義して、それぞれウェブページの外部チェーンを登って、ウェブページの内部チェーンを取って、内部チェーンの関数に入って、そして関数を調整します。
3、百度の写真を登る(https://image.baidu.com/)まず、2つの列と2つの配列を定義し、それぞれ内部チェーンと外部チェーンを保存する。プログラム開始時に、まず現在のウェブページの内部チェーンと外部チェーンを登り、それぞれチームに入り、内部チェーンの外部チェーンを判断します。もし配列に存在しないなら、これを配列に追加します。
4、続いてdeeplinks()関数を呼び出して、循環構造を採用し、現在の内部チェーンの数が空でない場合は、格納内チェーンのキューを列から出して、その内部チェーンに入って、ウェブページ内チェーンとウェブページ外チェーンの関数を繰り返し呼び出して、ウェブリンクが重複しているかどうかを判断します。重複しない場合は、それぞれ内部チェーン、外部チェーンを対応するキューに追加します。繰り返し;
5、ウェブページ内のすべての内部チェーンに入って、中からすべての外部チェーンを検索してキューに保存してから出力します。
公式サイト
在这里插入图片描述
在这里插入图片描述
コードの詳細
キュー
キューは特殊な線形表で、一方の列は端にデータ(後)を挿入するだけで、他端はデータ(前)を削除することができます。
それはスタックと同じで、キューは制限された線形表である。
挿入操作をすることをチームの最後といい、削除操作を行うことをチームヘッドといいます。
キューのデータを要素と呼びます。要素のないキューを空のキューと呼びます。
端だけが削除されたり、挿入されたりするので、最初に列に入るだけが削除されます。したがって、先进先出(FIFO-first in first out)とも言われます。
ここで私たちはクラスで列を定義して、先に出発して、列の最後に入隊して、列の頭は隊を出て、この列は以下の機能を定義します。

class Queue(object):
    #     
    def __init__(self):
        self.items = []
        
    #  
    def enqueue(self, item):
        self.items.append(item)
        
    #  
    def dequeue(self):
        if self.is_Empty():
            print("      !!")
        else:
            return self.items.pop(0)
        
    #      
    def is_Empty(self):
        return self.items == []
        
    #    
    def size(self):
        return len(self.items)
    
    #      ,        ,  None
    def front(self):
        if self.is_Empty():
            print("      !!")
        else:
            return self.items[len(self.items) - 1]
内鎖外鎖
内鎖外鎖の違い:
内鎖:同じウェブサイトのドメイン名の下でコンテンツページ間の相互リンクを指します。
外部チェーン:他のサイトに自分のサイトのリンクを導入すること。例えば、友情リンク、外部チェーンの構築など。
通俗的には、内部チェーンは同じドメイン名を持つリンクであり、外部チェーンのドメイン名は同じではない。
内鎖外部チェーンと言えば、必ずurllibライブラリから離れられなくなります。まずライブラリを導入します。

from urllib.parse import urlparse
url parseモジュールを用いてurlリンクを解析し、url parse()モジュールはurlを6つの部分に分割する。

scheme (  )

netloc (  )

path (  )

params (    )

query (     )

fragment (   )

url='https://image.baidu.com/'
a, b = urlparse(url).scheme, urlparse(url).netloc
print(a)
print(b)

#-----------------    ---------------------#
https
image.baidu.com
請求先
Headerソースはブラウザでアクセスするウェブページを開き、F 12によってnetworkを開いて、ヒントを押してctr+Rを押して、nameをクリックしてウェブサイト名を選択して、右フレームの最初のheadersを見て、request headersを見つけます。これはブラウザの要求ヘッダです。その中のuser-agentをコピーして、内容をコピーします。
在这里插入图片描述
ここの要求先は:

headers_={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68'}
html = requests.get(url,headers=headers_)
完全コード

class Queue(object):
    #     
    def __init__(self):
        self.items = []
        
    #  
    def enqueue(self, item):
        self.items.append(item)
        
    #  
    def dequeue(self):
        if self.is_Empty():
            print("      !!")
        else:
            return self.items.pop(0)
        
    #      
    def is_Empty(self):
        return self.items == []
        
    #    
    def size(self):
        return len(self.items)
    
    #      ,        ,  None
    def front(self):
        if self.is_Empty():
            print("      !!")
        else:
            return self.items[len(self.items) - 1]


#   
from urllib.request import urlopen
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import requests
import re
import urllib.parse
import time
import random


queueInt = Queue()   #       
queueExt = Queue()   #       

externalLinks = []
internalLinks = []

#            
def getExterLinks(bs, exterurl):
    
    #     www http        URL   
    for link in bs.find_all('a', href = re.compile
                            ('^(http|www)((?!'+urlparse(exterurl).netloc+').)*$')):
        #    ,URL      ASCII  ,    (   )       ,
        #                ,        。
        link.attrs['href'] = urllib.parse.quote(link.attrs['href'],safe='?=&:/')
        if link.attrs['href'] is not None:
            if link.attrs['href'] not in externalLinks:
                queueExt.enqueue(link.attrs['href'])
                externalLinks.append(link.attrs['href'])
                print(link.attrs['href'])
#     return externalLinks

#                
def getInterLinks(bs, interurl):
    interurl = '{}://{}'.format(urlparse(interurl).scheme,
                                urlparse(interurl).netloc)
   
    #     “/”       
    for link in bs.find_all('a', href = re.compile
                            ('^(/|.*'+urlparse(interurl).netloc+')')):
        link.attrs['href'] = urllib.parse.quote(link.attrs['href'],safe='?=&:/')
        if link.attrs['href'] is not None:
            if link.attrs['href'] not in internalLinks:
        #startsWith()                          “  ” 
                if(link.attrs['href'].startswith('//')):
                    if interurl+link.attrs['href'] not in internalLinks:
                        queueInt.enqueue(interurl+link.attrs['href'])
                        internalLinks.append(interurl+link.attrs['href'])
                elif(link.attrs['href'].startswith('/')):
                    if interurl+link.attrs['href'] not in internalLinks:
                        queueInt.enqueue(interurl+link.attrs['href'])
                        internalLinks.append(interurl+link.attrs['href'])
                else:
                    queueInt.enqueue(link.attrs['href'])
                    internalLinks.append(link.attrs['href'])
#     return internalLinks

def deepLinks():
    num = queueInt.size()
    while num > 1:
        i = queueInt.dequeue()
        if i is None:
            break
        else:
            print('     ')
            print(i)
            print('      ')
    #         html = urlopen(i)
            html=requests.get(i,headers=headers_)
            time.sleep(random.random()*3)
            domain1 = '{}://{}'.format(urlparse(i).scheme, urlparse(i).netloc)
            bs = BeautifulSoup(html.content, 'html.parser')
            getExterLinks(bs, domain1)
            getInterLinks(bs, domain1)


def getAllLinks(url):
    global num
#     html = urlopen(url)
    headers_={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68'}
    html = requests.get(url,headers=headers_)
    time.sleep(random.random()*3) #      ,       
    domain = '{}://{}'.format(urlparse(url).scheme, urlparse(url).netloc)
    bs = BeautifulSoup(html.content, 'html.parser')

    getInterLinks(bs, domain)
    getExterLinks(bs, domain)
    deepLinks()

getAllLinks('https://image.baidu.com/')
登って結果を出す
ここは部分を切り取るだけです。
在这里插入图片描述
在这里插入图片描述
配列内のすべての内部チェーン

internalLinks

-------------    ------------------

['http://image.baidu.com',
 'https://image.baidu.com/img/image/imageplus/index.html?fr=image',
 'http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1567133149621_R&pv=&ic=0&nc=1&z=0&hd=0&latest=0&copyright=0&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%25E5%25A3%2581%25E7%25BA%25B8',
 'http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1461834053046_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&itg=0&ie=utf-8&word=%25E5%25A4%25B4%25E5%2583%258F%23z=0&pn=&ic=0&st=-1&face=0&s=0&lm=-1',
 'https://image.baidu.com/search/albumslist?tn=albumslist&word=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590&album_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590&rn=15&fr=searchindex',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%25E5%259F%258E%25E5%25B8%2582%25E5%25BB%25BA%25E7%25AD%2591%25E6%2591%2584%25E5%25BD%25B1%25E4%25B8%2593%25E9%25A2%2598&fr=searchindex_album%2520&album_tab=%25E5%25BB%25BA%25E7%25AD%2591&album_id=7&rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%25E6%25B8%2590%25E5%258F%2598%25E9%25A3%258E%25E6%25A0%25BC%25E6%258F%2592%25E7%2594%25BB&fr=albumslist&album_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590&album_id=409&rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%25E7%259A%25AE%25E5%25BD%25B1&fr=albumslist&album_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590&album_id=394&rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%25E5%25AE%25A0%25E7%2589%25A9%25E5%259B%25BE%25E7%2589%2587&fr=albumslist&album_tab=%25E5%258A%25A8%25E7%2589%25A9&album_id=688&rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%25E8%2588%25AA%25E6%258B%258D%25E5%259C%25B0%25E7%2590%2583%25E7%25B3%25BB%25E5%2588%2597&fr=albumslist&album_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590&album_id=312&rn=30',
 'https://image.baidu.com/search/albumslist?tn=albumslist&word=%25E4%25BA%25BA%25E7%2589%25A9&album_tab=%25E4%25BA%25BA%25E7%2589%25A9&rn=15&fr=searchindex_album',
 'http://image.baidu.com/static/html/advanced.html',
 'https://image.baidu.com/',
 'http://image.baidu.com/']
配列内のすべての外部チェーン

externalLinks

-------------    ------------------

['http://news.baidu.com/',
 'https://www.hao123.com/',
 'http://map.baidu.com/',
 'https://haokan.baidu.com/?sfrom=baidu-top/',
 'http://tieba.baidu.com/',
 'https://xueshu.baidu.com/',
 'http://www.baidu.com/more/',
 'https://pan.baidu.com',
 'https://zhidao.baidu.com',
 'https://baike.baidu.com',
 'https://baobao.baidu.com',
 'https://wenku.baidu.com',
 'https://jingyan.baidu.com',
 'http://music.taihe.com',
 'https://www.baidu.com',
 'https://www.baidu.com/',
 'http://www.baidu.com/duty/',
 'http://www.baidu.com/search/image_help.html',
 'http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001',
 'http://help.baidu.com/question',
 'http://www.baidu.com/search/jubao.html',
 'http://www.baidu.com/search/faq_image.html%2305']
ここで、Pythonがウェブサイトの内外チェーンを利用している記事を紹介します。これに関連して、Pythonがホームページの内外チェーンを利用しているものがもっと多いです。私たちの以前の文章を検索してください。または、下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。