中層:標簽網(wǎng)頁的獲取單網(wǎng)頁鏈接,難度簡單--wh03

中層:標簽網(wǎng)頁的獲取單網(wǎng)頁鏈接

一、實驗說明

1.1. 環(huán)境登錄

無需密碼自動登錄,系統(tǒng)用戶名shiyanlou

1.2. 環(huán)境介紹

本實驗環(huán)境采用帶桌面的Ubuntu Linux環(huán)境,實驗中會用到桌面上的程序:

  1. Xfce 終端: Linux命令行終端,打開后會進入 shell 環(huán)境,可以使用Linux命令
  2. Firefox:瀏覽器,可以用在需要前端界面的課程里,只需要打開環(huán)境里寫的HTML/JS頁面即可
  3. GVim:非常好用的編輯器,最簡單的用法可以參考課程Vim編輯器

1.3. 環(huán)境使用

使用GVim編輯器輸入實驗所需的代碼及文件,使用終端運行所需命令進行操作。

實驗報告可以在個人主頁中查看,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學(xué)習(xí)時間(指的是在實驗桌面內(nèi)操作的時間,如果沒有操作,系統(tǒng)會記錄為發(fā)呆時間)。這些都是您學(xué)習(xí)的真實性證明。

實驗樓虛擬機,自帶了python2.X和python3.X版本,無需安裝 該實驗建議使用 python2.7 版本, 也就是默認版本

二、課程介紹

組圖頁面的下載,上一節(jié)已經(jīng)完成了已經(jīng)完成了,這節(jié)呢,需要做的蠻簡單,但是任務(wù)有兩個:

  • 獲取該標簽的全部鏈接地址
  • 獲取每個鏈接頁面的全部組圖鏈接地址

觀察下圖

此處輸入圖片的描述
此處輸入圖片的描述

做個簡答的思路分析:

  • 首頁鏈接就是meizi.html,不過后面2、3、4、5、6的鏈接,只是后綴,我們需要簡單做個拼接,得到完整的鏈接腳本。另外,當前頁面就是1,所以1的鏈接為thisclass,我們采用的是從標簽首頁進去,然后直接獲取 >=2 的鏈接,利用標簽首頁地址,拼接得到標簽的所有完整鏈接地址,這是第一步,得到所有標簽完整鏈接路徑。
  • 每個鏈接里面,會有各組圖套圖的路徑,我們又需要從每個路徑里面全部讀取出來,再看下圖
組圖鏈接地址
組圖鏈接地址

其實就是在ul標簽的多個li,拿到ul標簽的代碼就行

三、代碼詳解

先附上獲取標簽鏈接的代碼,并給出詳細解析

第一個代碼塊:

文件名:meizi_series_nextpage
import re
import urllib2
#這個呢,是獲取組圖套圖的代碼,是下一個需要顯示的代碼塊
import meizi_series_getpage
#同樣的,這里是加載鏈接防超時,和上一節(jié)一樣
def loadurl(url):
    try:
        conn = urllib2.urlopen(url, timeout=5)
        html = conn.read()
        return html
    except urllib2.URLError:
        return ""
    except Exception:
        print("unkown exception in conn.read()")
        return ""

#上述代碼中,最后還有一個except Exception,用于處理URLErro類無法捕捉的其他異常。感謝實驗樓用戶@caitao。

#下面的這個path指的是保存本地的文件路徑,我在第一小節(jié)已經(jīng)講過了,還記得么?跟著代碼再將一次吧
def nextpage(url,path):
    reNextLink = "<a.*?href='(.*?)'>.*?</a>"
    #獲取reNextPage里的標簽的全部鏈接
    reNextPage = '<div.*?id="wp_page_number.*?>.*?<ul>(.*?)</ul>'
    #獲取ul標簽里面的內(nèi)容,里面包含了所有我們需要的鏈接,找到wp_page_number就可以了
    #下面目的是獲取鏈接名,組合傳入路徑得到當前路徑名,解釋:匹配a到z字符,>=1個
    searchPathTail = '.*/([a-z]+).*?.html'
    #獲取傳入的鏈接尾巴
    searchurltail = '.*/(.*?.html)'
    #獲取傳入的鏈接頭部
    searchhead = '(.*)/.*?.html'
    #分開頭和尾,是因為在獲取當前標簽的所有頁碼,都不是完整的,而是尾部鏈接,需要用尾部和頭部鏈接拼湊成完整的鏈接。頭部鏈接,就是傳入鏈接的頭部,而且傳入的是第一個完整鏈接,頁面1里面又沒有尾部鏈接,所有傳入鏈接的尾部,也需要找出
    pathTail = re.findall(searchPathTail,url,re.S)
    urlTail = re.findall(searchurltail,url,re.S)
    urlhead = re.findall(searchhead,url,re.S)
    #從傳入文件夾路徑和從鏈接中分析出的文件名,得到當前文件夾路徑,保存到path中
    path = path + '/' +pathTail[0]
    print path
    #標簽頁面的存儲列表nextpage
    nextpageurl = []
    html = ''
    while True:
        html = loadurl(url)
        if html == '':
            print 'load', url,'error'
            continue
        else:
            break
    nextPage = re.findall(reNextPage,html,re.S)
    nextLink = re.findall(reNextLink,nextPage[0],re.S)
    nextLink.append(urlTail[0])
    #這一段是將標簽頁碼的所有尾部鏈接保存到nextLink中,然后下面的for循環(huán),將完整的url鏈接,存儲到nextpageurl中
    nextLink = sorted(list(set(nextLink)))
    for i in nextLink:
        nextpageurl.append(urlhead[0]+"/"+i)
    #將url鏈接和對應(yīng)的文件路徑傳入"獲取標簽第n頁的所有組圖鏈接"的模板中,引號標記的,就是下一個代碼塊
    for i in nextpageurl:
        print i
        meizi_series_getpage.tag_series(i,path)

第二個代碼塊

#文件名:meizi_series_getpage
import re
import urllib2
import meizi_page_download

def loadurl(url):
    #依舊的,防超時和循環(huán)加載
    try:
        conn = urllib2.urlopen(url,timeout=5)
        html = conn.read()
        return html
    except urllib2.URLError:
        return ''
    except Exception:
        print("unkown exception in conn.read()")
        return ''
        
#這個函數(shù),簡單點就是根據(jù)套圖鏈接和傳入的路徑,得到套圖文件夾路徑,再傳給上一節(jié)的圖片下載模板
def oneOfSeries(urllist,path):
    searchname = '.*/(.*?).html'
    current_path = '' 
    for url in urllist:
        try:
            name = re.findall(searchname,url,re.S)
            current_path = path + '/' + name[0]
            meizi_page_download.picurl(url,current_path)
        except urllib2.URLError:
            pass

#傳入標簽的第n頁和文件夾路徑,獲取所有套圖url鏈接,和分析出對應(yīng)的文件夾路徑,傳給我們底層的圖片下載模板(也就是上一節(jié)啦)
def tag_series(url,path):
    #這里是直接匹配出套圖的鏈接,直接,注意是直接,最好是將結(jié)果和源碼對下結(jié)果,防止遺漏和多出
    reSeriesList = '<div .*?class="pic".*?>.*?<a.*?href="(.*?)".*?target.*?>'
    html = ''
    while True:
        html = loadurl(url)
        if html == '':
            print 'load', url,'error'
            continue
        else:
            break
    seriesList = re.findall(reSeriesList,html,re.S)
    if len(seriesList) ==0:
        pass
    else:
        oneOfSeries(seriesList,path)

實驗樓環(huán)境運行截圖,奉上:


實驗樓運行截圖(第三小節(jié))
實驗樓運行截圖(第三小節(jié))

四、總結(jié)

一共四步:

  • 從傳入的文件夾路徑和標簽鏈接,得到當前標簽的文件夾路徑
  • 從傳入的標簽鏈接,得到所有的標簽頁的url鏈接
  • 從傳入的標簽第n頁的url鏈接,得到所有的套圖url鏈接
  • 從套圖url鏈接和傳入的文件夾路徑,得到套圖的文件夾路徑
  • 將套圖文件夾路徑和套圖的url鏈接,傳給圖片下載的模板(上一節(jié)我們完成的那個代碼文件)
    本節(jié)到此結(jié)束了,下一節(jié)就是"高層:從頂層域獲取所有的標簽頁",基礎(chǔ)爬蟲的最后一個...

Follow me, let's go...

Python3教程、項目網(wǎng)站--傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 知識儲備,簡單爬蟲的必知必會,【核心】 一、實驗說明 1. 環(huán)境登錄 無需密碼自動登錄,系統(tǒng)用戶名shiyanlo...
    布拉豆閱讀 513評論 0 0
  • HTML標簽解釋大全 一、HTML標記 標簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,520評論 1 41
  • 高層:從頂層域獲取所有的標簽頁 一、實驗說明 1. 環(huán)境登錄 無需密碼自動登錄,系統(tǒng)用戶名shiyanlou 2....
    布拉豆閱讀 326評論 0 0
  • 時間到底值不值錢呢? 剛剛聽到一個廣告說的是游戲,你的時間非常值錢,我在XX等你。 這個游戲是剛上市的,就是說先去...
    安梓閱讀 1,293評論 0 1

友情鏈接更多精彩內(nèi)容