最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python爬取網(wǎng)頁(yè)的所有內(nèi)外鏈的代碼

 更新時(shí)間:2021年04月09日 10:32:58   作者:Hundred°C  
這篇文章主要介紹了Python爬取網(wǎng)頁(yè)的所有內(nèi)外鏈,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

項(xiàng)目介紹

采用廣度優(yōu)先搜索方法獲取一個(gè)網(wǎng)站上的所有外鏈。
首先,我們進(jìn)入一個(gè)網(wǎng)頁(yè),獲取網(wǎng)頁(yè)的所有內(nèi)鏈和外鏈,再分別進(jìn)入內(nèi)鏈中,獲取該內(nèi)鏈的所有內(nèi)鏈和外鏈,直到訪問(wèn)完所有內(nèi)鏈未知。

代碼大綱

1、用class類(lèi)定義一個(gè)隊(duì)列,先進(jìn)先出,隊(duì)尾入隊(duì),隊(duì)頭出隊(duì);
2、定義四個(gè)函數(shù),分別是爬取網(wǎng)頁(yè)外鏈,爬取網(wǎng)頁(yè)內(nèi)鏈,進(jìn)入內(nèi)鏈的函數(shù),以及調(diào)函數(shù);
3、爬取百度圖片(https://image.baidu.com/),先定義兩個(gè)隊(duì)列和兩個(gè)數(shù)組,分別來(lái)存儲(chǔ)內(nèi)鏈和外鏈;程序開(kāi)始時(shí),先分別爬取當(dāng)前網(wǎng)頁(yè)的內(nèi)鏈和外鏈,再分別入隊(duì),對(duì)內(nèi)鏈外鏈進(jìn)行判斷,如果在數(shù)組中沒(méi)有存在,這添加到數(shù)組中;
4、接著調(diào)用deepLinks()函數(shù),采用循環(huán)結(jié)構(gòu),如果當(dāng)前內(nèi)鏈數(shù)量不為空時(shí),則對(duì)存儲(chǔ)內(nèi)鏈的隊(duì)列進(jìn)行出隊(duì),并進(jìn)入該內(nèi)鏈中,再重復(fù)調(diào)用爬取網(wǎng)頁(yè)內(nèi)鏈和網(wǎng)頁(yè)外鏈的函數(shù),進(jìn)行判斷網(wǎng)頁(yè)鏈接是否重復(fù), 不重復(fù)的話,再分別將內(nèi)鏈,外鏈加入到對(duì)應(yīng)的隊(duì)列中,不斷迭代循環(huán);
5、進(jìn)入網(wǎng)頁(yè)內(nèi)所有的內(nèi)鏈,從中搜索出所有的外鏈并且存儲(chǔ)在隊(duì)列中,再輸出。

網(wǎng)站詳情

在這里插入圖片描述
在這里插入圖片描述

代碼詳情

隊(duì)列

隊(duì)列是一種特殊的線性表,單向隊(duì)列只能在一端插入數(shù)據(jù)(后),另一端刪除數(shù)據(jù)(前);
它和棧一樣,隊(duì)列是一種操作受限制的線性表;
進(jìn)行插入操作的稱為隊(duì)尾,進(jìn)行刪除操作的稱為隊(duì)頭;
隊(duì)列中的數(shù)據(jù)被稱為元素;沒(méi)有元素的隊(duì)列稱為空隊(duì)列。

由于只能一端刪除或者插入,所以只有最先進(jìn)入隊(duì)列的才能被刪除,因此又被稱為先進(jìn)先出(FIFO—first in first out)線性表。
這里我們用class類(lèi)定義一個(gè)隊(duì)列,先進(jìn)先出,隊(duì)尾入隊(duì),隊(duì)頭出隊(duì),該隊(duì)列要有定義以下功能:出隊(duì)、入隊(duì)、判斷是否為空、輸出隊(duì)列長(zhǎng)度、返回隊(duì)頭元素。

class Queue(object):
    #初始化隊(duì)列
    def __init__(self):
        self.items = []
        
    #入隊(duì)
    def enqueue(self, item):
        self.items.append(item)
        
    #出隊(duì)
    def dequeue(self):
        if self.is_Empty():
            print("當(dāng)前隊(duì)列為空!!")
        else:
            return self.items.pop(0)
        
    #判斷是否為空
    def is_Empty(self):
        return self.items == []
        
    #隊(duì)列長(zhǎng)度
    def size(self):
        return len(self.items)
    
    #返回隊(duì)頭元素,如果隊(duì)列為空的話,返回None
    def front(self):
        if self.is_Empty():
            print("當(dāng)前隊(duì)列為空??!")
        else:
            return self.items[len(self.items) - 1]

內(nèi)鏈外鏈

內(nèi)鏈外鏈的區(qū)別:
內(nèi)鏈:是指同一網(wǎng)站域名下內(nèi)容頁(yè)面之間的互相鏈接。
外鏈:是指在別的網(wǎng)站導(dǎo)入自己網(wǎng)站的鏈接,如友情鏈接、外鏈的搭建等。
通俗的講,內(nèi)鏈即為帶有相同域名的鏈接,而外鏈的域名則不相同。

說(shuō)到內(nèi)鏈外鏈,那必然離不開(kāi)urllib庫(kù)了,首先導(dǎo)入庫(kù)

from urllib.parse import urlparse

用urlparse模塊來(lái)解析url鏈接,urlparse()模塊將url拆分為6部分:

scheme (協(xié)議)

netloc (域名)

path (路徑)

params (可選參數(shù))

query (連接鍵值對(duì))

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

#-----------------輸出結(jié)果---------------------#
https
image.baidu.com

請(qǐng)求頭

Header來(lái)源 用瀏覽器打開(kāi)需要訪問(wèn)的網(wǎng)頁(yè),按F12,點(diǎn)開(kāi)network,再按提示按ctr+R,點(diǎn)擊name選擇網(wǎng)站名,再看到有一個(gè)右邊框第一個(gè)headers,找到request headers,這個(gè)就是瀏覽器的請(qǐng)求頭, 復(fù)制其中的user-agent,復(fù)制內(nèi)容。

在這里插入圖片描述

這里的請(qǐng)求頭為:

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):
    #初始化隊(duì)列
    def __init__(self):
        self.items = []
        
    #入隊(duì)
    def enqueue(self, item):
        self.items.append(item)
        
    #出隊(duì)
    def dequeue(self):
        if self.is_Empty():
            print("當(dāng)前隊(duì)列為空?。?)
        else:
            return self.items.pop(0)
        
    #判斷是否為空
    def is_Empty(self):
        return self.items == []
        
    #隊(duì)列長(zhǎng)度
    def size(self):
        return len(self.items)
    
    #返回隊(duì)頭元素,如果隊(duì)列為空的話,返回None
    def front(self):
        if self.is_Empty():
            print("當(dāng)前隊(duì)列為空??!")
        else:
            return self.items[len(self.items) - 1]


#導(dǎo)入庫(kù)
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()   #存儲(chǔ)內(nèi)鏈的隊(duì)列
queueExt = Queue()   #存儲(chǔ)外鏈的隊(duì)列

externalLinks = []
internalLinks = []

#獲取頁(yè)面中所有外鏈的列表
def getExterLinks(bs, exterurl):
    
    #找出所有以www或http開(kāi)頭且不包含當(dāng)前URL的鏈接
    for link in bs.find_all('a', href = re.compile
                            ('^(http|www)((?!'+urlparse(exterurl).netloc+').)*$')):
        #按照標(biāo)準(zhǔn),URL只允許一部分ASCII字符,其他字符(如漢字)是不符合標(biāo)準(zhǔn)的,
        #我們的鏈接網(wǎng)址可能存在漢字的情況,此時(shí)就要進(jìn)行編碼。
        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

#獲取頁(yè)面中所以內(nèi)鏈的列表    
def getInterLinks(bs, interurl):
    interurl = '{}://{}'.format(urlparse(interurl).scheme,
                                urlparse(interurl).netloc)
   
    #找出所有以“/”開(kāi)頭的內(nèi)部鏈接
    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()方法用來(lái)判斷當(dāng)前字符串是否是以另外一個(gè)給定的子字符串“開(kāi)頭”的
                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('訪問(wèn)的內(nèi)鏈')
            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) #模擬人類(lèi)行為,間隔隨機(jī)的時(shí)間
    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/')

爬取結(jié)果

這里我只是截取一部分:

在這里插入圖片描述
在這里插入圖片描述

數(shù)組中的所有內(nèi)鏈

internalLinks

-------------輸出內(nèi)容------------------

['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/']

數(shù)組中的所有外鏈

externalLinks

-------------輸出內(nèi)容------------------

['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']

到此這篇關(guān)于Python爬取網(wǎng)頁(yè)的所有內(nèi)外鏈的文章就介紹到這了,更多相關(guān)Python爬取網(wǎng)頁(yè)內(nèi)外鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組

    Python實(shí)現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組

    這篇文章主要介紹了Python實(shí)現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 教你怎么用Python監(jiān)控愉客行車(chē)程

    教你怎么用Python監(jiān)控愉客行車(chē)程

    這篇文章主要介紹了教你怎么用Python監(jiān)控愉客行車(chē)程,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 使用C++擴(kuò)展Python的功能詳解

    使用C++擴(kuò)展Python的功能詳解

    這篇文章主要介紹了使用C++擴(kuò)展Python的功能詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python使用urllib2獲取網(wǎng)絡(luò)資源實(shí)例講解

    Python使用urllib2獲取網(wǎng)絡(luò)資源實(shí)例講解

    urllib2是Python的一個(gè)獲取URLs(Uniform Resource Locators)的組件。他以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的接口,下面我們用實(shí)例講解他的使用方法
    2013-12-12
  • python實(shí)現(xiàn)兩個(gè)文件合并功能

    python實(shí)現(xiàn)兩個(gè)文件合并功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)兩個(gè)文件合并功能,一個(gè)簡(jiǎn)單的文件合并程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python使用keras和tensorflow遇到的問(wèn)題及解決

    Python使用keras和tensorflow遇到的問(wèn)題及解決

    這篇文章主要介紹了Python使用keras和tensorflow遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • python中注釋用法簡(jiǎn)單示例

    python中注釋用法簡(jiǎn)單示例

    注釋即對(duì)程序代碼的解釋,在寫(xiě)程序時(shí)需適當(dāng)使用注釋,以方便自己和他人理解程序各部分的作用,下面這篇文章主要給大家介紹了關(guān)于python中注釋用法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 淺談Python淺拷貝、深拷貝及引用機(jī)制

    淺談Python淺拷貝、深拷貝及引用機(jī)制

    本篇文章主要介紹了Python淺拷貝、深拷貝及引用機(jī)制,詳細(xì)的介紹了淺拷貝、深拷貝的介紹和區(qū)別,有興趣的可以了解一下。
    2016-12-12
  • 使用Pandas實(shí)現(xiàn)MySQL窗口函數(shù)的解決方法

    使用Pandas實(shí)現(xiàn)MySQL窗口函數(shù)的解決方法

    本文主要介紹 MySQL 中的窗口函數(shù)row_number()、lead()/lag()、rank()/dense_rank()、first_value()、count()、sum()如何使用pandas實(shí)現(xiàn),同時(shí)二者又有什么區(qū)別,感興趣的朋友一起看看吧
    2023-02-02
  • 使用Python實(shí)現(xiàn)檢測(cè)并刪除離群值

    使用Python實(shí)現(xiàn)檢測(cè)并刪除離群值

    離群值是一個(gè)數(shù)據(jù)項(xiàng)/對(duì)象,它明顯偏離其余的(所謂的正常)對(duì)象,本文主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)檢測(cè)并刪除離群值,感興趣的小伙伴可以了解下
    2024-01-01

最新評(píng)論

大安市| 万州区| 辉县市| 玉田县| 佛坪县| 乌兰浩特市| 昆明市| 铅山县| 黄平县| 上犹县| 峡江县| 青州市| 政和县| 庆云县| 南安市| 庆城县| 德安县| 固原市| 石渠县| 岳西县| 商城县| 时尚| 抚顺市| 连州市| 巫溪县| 班戈县| 辰溪县| 正宁县| 崇州市| 左贡县| 防城港市| 洛浦县| 辛集市| 镇沅| 且末县| 萨嘎县| 勐海县| 青冈县| 独山县| 台南市| 安乡县|