思路:1、get_totalpages(url) 通過【性。感。美。女。圖】獲得該版塊的總頁數 【首頁1234567891011下一頁末頁共 21頁1034條】
2、get_sercoverurl(pageurl) 版塊每一頁有50個系列的封面,獲得每個封面的地址。
3、 進入該封面(即系列),獲得該系列圖片的總張數【[url=]共79頁:[/url]上一頁12345678910111213下一頁】
4、get_serurl(sercoverurl) 獲得每一個圖片所在頁面的地址
5、urllib.request.urlretrieve(picurl, filename) 獲得圖片的下載地址。
根據網站結構,總結了 版塊 -< 系列 -- 系列封面 -< 圖片頁面 -- 圖片下載地址 的編排規律,
其中" -< " 表示 1對多,即1個版塊有多個系列, 1個系列封面有多個圖片;
" -- " 表示 1對1, 如1個系列只有1個封面, 1個圖片頁面只有1個圖片下載地址
搞清楚這些就明白哪些地方需要循環了。
廢話太多,直接上代碼吧!
import urllib.request import os import re def url_open(url): req = urllib.request.Request(url) req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36') response = urllib.request.urlopen(url) html = response.read() return html def get_totalpages(url): #通過版塊地址獲得該版塊所有頁數(每頁有50個系列),返回值為數字 html = url_open(url).decode('gbk') reg = r'共 <strong>(.*?)</strong>頁' totalpages = re.findall(reg,html)[0] return int(totalpages) def get_sercoverurl(pageurl): #通過頁面地址獲得該頁面下所有系列的封面地址,返回值為列表 html = url_open(pageurl).decode('gbk') reg = r'<p><a href="(.*?)"' sercoverurl = re.findall(reg, html) return sercoverurl #各個系列的封面 列表 def get_serurl(sercoverurl): #通過封面獲得該系列的所有圖片所在的頁面地址 (每個頁面有一張圖片,其地址待下一步獲取) html = url_open(sercoverurl).decode('gbk') # reg1 = r'<li><a>共(.*?)頁' totalsheets = int(re.findall(reg1, html)[0]) # 獲得該系列圖片總張數 serurls = [] serurls.append(sercoverurl) for eachsheet in range(2,totalsheets+1): serurl = sercoverurl[:-5] + '_' + str(eachsheet) + sercoverurl[-5:] serurls.append(serurl) return serurls def get_picurl(serurl): html = url_open(serurl).decode('gbk') reg = r"<img src='(.*?)'" picurl = re.findall(reg,html)[0] return picurl #只有一個地址,即封面地址 def download_cl(folder = '爬蟲youmzi'): #主程序 try: os.mkdir(folder) os.chdir(folder) except: os.chdir(folder) url = 'http://www.youmzi.com/meinv.html' totalpages = get_totalpages(url) print(totalpages) for eachpage in range(1,totalpages+1): pageurl = url[:-5] + '_'+ str(eachpage) + url[-5:] print(pageurl) sercoverurl = get_sercoverurl(pageurl) #獲得系列的封面地址 列表 print(sercoverurl) for eachsercover in sercoverurl: serurl = get_serurl(eachsercover) #返回系列的所有地址 列表 for oneser in serurl: picurl = get_picurl(oneser) print(picurl) filename = picurl.split('/')[-1] urllib.request.urlretrieve(picurl, filename) if __name__ == '__main__': download_cl()