濮阳杆衣贸易有限公司

主頁 > 知識庫 > Python爬取網頁的所有內外鏈的代碼

Python爬取網頁的所有內外鏈的代碼

熱門標簽:京華圖書館地圖標注 打印谷歌地圖標注 電話機器人貸款詐騙 蘇州人工外呼系統(tǒng)軟件 看懂地圖標注方法 電話外呼系統(tǒng)招商代理 佛山通用400電話申請 廣東旅游地圖標注 淮安呼叫中心外呼系統(tǒng)如何

項目介紹

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

代碼大綱

1、用class類定義一個隊列,先進先出,隊尾入隊,隊頭出隊;
2、定義四個函數,分別是爬取網頁外鏈,爬取網頁內鏈,進入內鏈的函數,以及調函數;
3、爬取百度圖片(https://image.baidu.com/),先定義兩個隊列和兩個數組,分別來存儲內鏈和外鏈;程序開始時,先分別爬取當前網頁的內鏈和外鏈,再分別入隊,對內鏈外鏈進行判斷,如果在數組中沒有存在,這添加到數組中;
4、接著調用deepLinks()函數,采用循環(huán)結構,如果當前內鏈數量不為空時,則對存儲內鏈的隊列進行出隊,并進入該內鏈中,再重復調用爬取網頁內鏈和網頁外鏈的函數,進行判斷網頁鏈接是否重復, 不重復的話,再分別將內鏈,外鏈加入到對應的隊列中,不斷迭代循環(huán);
5、進入網頁內所有的內鏈,從中搜索出所有的外鏈并且存儲在隊列中,再輸出。

網站詳情


代碼詳情

隊列

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

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

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]

內鏈外鏈

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

說到內鏈外鏈,那必然離不開urllib庫了,首先導入庫

from urllib.parse import urlparse

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

scheme (協(xié)議)

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來源 用瀏覽器打開需要訪問的網頁,按F12,點開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=baiduimageipn=rct=201326592cl=2lm=-1st=-1fm=resultfr=sf=1fmq=1567133149621_Rpv=ic=0nc=1z=0hd=0latest=0copyright=0se=1showtab=0fb=0width=height=face=0istype=2ie=utf-8sid=word=%25E5%25A3%2581%25E7%25BA%25B8',
 'http://image.baidu.com/search/index?tn=baiduimageipn=rct=201326592cl=2lm=-1st=-1fm=resultfr=sf=1fmq=1461834053046_Rpv=ic=0nc=1z=se=1showtab=0fb=0width=height=face=0istype=2itg=0ie=utf-8word=%25E5%25A4%25B4%25E5%2583%258F%23z=0pn=ic=0st=-1face=0s=0lm=-1',
 'https://image.baidu.com/search/albumslist?tn=albumslistword=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590album_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590rn=15fr=searchindex',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetailword=%25E5%259F%258E%25E5%25B8%2582%25E5%25BB%25BA%25E7%25AD%2591%25E6%2591%2584%25E5%25BD%25B1%25E4%25B8%2593%25E9%25A2%2598fr=searchindex_album%2520album_tab=%25E5%25BB%25BA%25E7%25AD%2591album_id=7rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetailword=%25E6%25B8%2590%25E5%258F%2598%25E9%25A3%258E%25E6%25A0%25BC%25E6%258F%2592%25E7%2594%25BBfr=albumslistalbum_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590album_id=409rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetailword=%25E7%259A%25AE%25E5%25BD%25B1fr=albumslistalbum_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590album_id=394rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetailword=%25E5%25AE%25A0%25E7%2589%25A9%25E5%259B%25BE%25E7%2589%2587fr=albumslistalbum_tab=%25E5%258A%25A8%25E7%2589%25A9album_id=688rn=30',
 'https://image.baidu.com/search/albumsdetail?tn=albumsdetailword=%25E8%2588%25AA%25E6%258B%258D%25E5%259C%25B0%25E7%2590%2583%25E7%25B3%25BB%25E5%2588%2597fr=albumslistalbum_tab=%25E8%25AE%25BE%25E8%25AE%25A1%25E7%25B4%25A0%25E6%259D%2590album_id=312rn=30',
 'https://image.baidu.com/search/albumslist?tn=albumslistword=%25E4%25BA%25BA%25E7%2589%25A9album_tab=%25E4%25BA%25BA%25E7%2589%25A9rn=15fr=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爬取網頁內外鏈內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python爬蟲之教你如何爬取地理數據
  • python 爬取知乎回答下的微信8.0狀態(tài)視頻
  • python爬取梨視頻生活板塊最熱視頻
  • python用pyecharts實現地圖數據可視化
  • python爬取各省降水量及可視化詳解

標簽:股票 呼和浩特 江蘇 畢節(jié) 衡水 駐馬店 中山 湖州

巨人網絡通訊聲明:本文標題《Python爬取網頁的所有內外鏈的代碼》,本文關鍵詞  Python,爬取,網頁,的,所有,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python爬取網頁的所有內外鏈的代碼》相關的同類信息!
  • 本頁收集關于Python爬取網頁的所有內外鏈的代碼的相關信息資訊供網民參考!
  • 推薦文章
    津南区| 莱芜市| 东辽县| 丰都县| 和政县| 潍坊市| 明溪县| 上犹县| 翁牛特旗| 奉化市| 连山| 潮安县| 抚宁县| 登封市| 忻州市| 莱西市| 镇雄县| 阜南县| 石棉县| 宁安市| 孟津县| 贵州省| 和政县| 邢台市| 来凤县| 香格里拉县| 阿拉善左旗| 南丰县| 宿松县| 北辰区| 墨竹工卡县| 侯马市| 运城市| 军事| 海丰县| 繁昌县| 通道| 许昌市| 大邑县| 娱乐| 七台河市|