爬取網站:第一PPT(http://www.1ppt.com/) 此網站真的良心
老樣子,先上最后成功的源碼(在D盤創建一個"D:\PPT"文件夾,直接將代碼執行就可獲取到PPT):
import requests import urllib import os from bs4 import BeautifulSoup from fake_useragent import UserAgent def getPPT(url): f = requests.get(url,headers=headers) #發送GET請求
f.encoding = f.apparent_encoding #設置編碼方式
soup1 = BeautifulSoup(f.text,'lxml') #使用lxml解析器解析 classHtml = soup1.find('div',class_="col_nav i_nav clearfix").select('a') #在html中查找標簽為div,class屬性為 col_nav...的代碼塊並獲取所有的 a 標簽
for i in classHtml[:56]: #只要前56個類別 classUrl = i['href'].split('/')[2] #將ppt模板類別關鍵詞存到classUrl,i['href']表示獲取i中href屬性的值,split('/')[2]表示以'/'為分隔符區第二個值
if not os.path.isdir(r'D:\PPT\\'+i['title']): #判斷有無此目錄,兩個\\,第一個\轉義了第二個\
os.mkdir(r'D:\PPT\\'+i['title']) #若無,創建此目錄。
else: continue #若有此目錄,直接退出循環,就認為此類別已經下載完畢了
n = 0 #定義一個變量用來統計模板的個數 for y in range(1,15): #假設每個類別都有14頁ppt(頁數這一塊找了很久,沒找到全部獲取的方法,只能采取此措施)
pagesUrl = url+i['href']+'/ppt_'+classUrl+'_'+str(y)+'.html' #獲取每一頁的URL a = requests.get(pagesUrl,headers=headers) if a.status_code != 404: #排除狀態碼為404的網頁
soup2 = BeautifulSoup(a.text,'lxml') for downppt in soup2.find('ul',class_='tplist').select('li > a'): #獲取每一個模板下載界面的URL,find作用不再贅述,select('li > a')表示查看li標簽下的a標簽的內容
b = requests.get(url+downppt['href'],headers=headers) #獲取最后的下載界面的html b.encoding = b.apparent_encoding #設置編碼類型
soup3 = BeautifulSoup(b.text,'lxml') #因為到了一個新的界面,要重新獲取當前界面html downList = soup3.find('ul',class_='downurllist').select('a') #獲取下載PPT的URL
pptName = soup3.select('h1') #獲取ppt模板名稱
print('Downloading......') try: urllib.request.urlretrieve(downList[0]['href'],r'D:\PPT\\'+i['title']+'/'+pptName[0].get_text()+'.rar') #開始下載模板
print(i['title']+'type template download completed the '+str(n)+' few.'+pptName[0].get_text()) n += 1 except: print(i['title']+'type download failed the '+str(n)+' few.') n += 1
if __name__ == '__main__': headers = {'user-agent':UserAgent().random} #定義請求頭
getPPT('http://www.1ppt.com')
效果圖:

邏輯其實挺簡單的,代碼也不算復雜。
代碼基本都有注釋,先一起捋一遍邏輯吧,邏輯搞清楚,代碼不在話下。
1、首先網站首頁:F12—>選擇某個類別(比如科技模板)右擊—>檢查—>查看右側的html代碼

發現類別的URL保存在 <div class="col_nav" i_nav clearfix> 下的 <li> 標簽里的 <a> 標簽的 href 屬性值中
於是想到用 BeautifulSoup 庫的 find() 方法和 select() 方法
2、進入類別界面
同樣:F12—>選擇某個PPT(例如第一個)右擊—>檢查—>查看右側html代碼

照葫蘆畫瓢,繼續獲取進入下載界面的URL,方法同上
但在此頁面需要注意的是,下邊有選頁標簽:

我暫時沒有想到准確獲取一共有多少頁的方式,所以我在此代碼中選擇用range()函數來假設每個類別都有14頁,然后再進行一步判斷,看返回的http狀態碼是否為200。
3、進入具體PPT的下載界面
與上操作相同,獲取最終PPT的下載URL

我在此代碼中選擇用 urllib 庫來進行下載,最終將相對應類別的PPT放置同一文件夾中。
文件夾操作我是調用 os 庫,具體代碼還是往上翻一翻吧。
具體流程就這么幾步了,剩下的就是循環 循環 再循環......
循環語句寫好,就大功告成了!一起努力。
