中層:標簽網(wǎng)頁的獲取單網(wǎng)頁鏈接
一、實驗說明
1.1. 環(huán)境登錄
無需密碼自動登錄良蛮,系統(tǒng)用戶名shiyanlou
1.2. 環(huán)境介紹
本實驗環(huán)境采用帶桌面的Ubuntu Linux環(huán)境雇初,實驗中會用到桌面上的程序:
- Xfce 終端: Linux命令行終端灶伊,打開后會進入 shell 環(huán)境,可以使用Linux命令
- Firefox:瀏覽器货徙,可以用在需要前端界面的課程里芍瑞,只需要打開環(huán)境里寫的HTML/JS頁面即可
- GVim:非常好用的編輯器晨仑,最簡單的用法可以參考課程Vim編輯器
1.3. 環(huán)境使用
使用GVim編輯器輸入實驗所需的代碼及文件,使用終端運行所需命令進行操作拆檬。
實驗報告可以在個人主頁中查看洪己,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學習時間(指的是在實驗桌面內(nèi)操作的時間竟贯,如果沒有操作答捕,系統(tǒng)會記錄為發(fā)呆時間)。這些都是您學習的真實性證明屑那。
實驗樓虛擬機拱镐,自帶了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é)
一共四步:
- 從傳入的文件夾路徑和標簽鏈接俊庇,得到當前標簽的文件夾路徑
- 從傳入的標簽鏈接狮暑,得到所有的標簽頁的url鏈接
- 從傳入的標簽第n頁的url鏈接,得到所有的套圖url鏈接
- 從套圖url鏈接和傳入的文件夾路徑辉饱,得到套圖的文件夾路徑
- 將套圖文件夾路徑和套圖的url鏈接搬男,傳給圖片下載的模板(上一節(jié)我們完成的那個代碼文件)
本節(jié)到此結(jié)束了,下一節(jié)就是"高層:從頂層域獲取所有的標簽頁"彭沼,基礎(chǔ)爬蟲的最后一個...
Follow me, let's go...
Python3教程缔逛、項目網(wǎng)站--傳送門