爬取網站:第一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 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 庫,具體代碼還是往上翻一翻吧,
具體流程就這么幾步了,剩下的就是回圈 回圈 再回圈......
回圈陳述句寫好,就大功告成了!一起努力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/176262.html
標籤:Python
下一篇:3.機器學習之決策樹詳解
