####前言 其實很簡短就是利用爬蟲的第三方庫Requests與BeautifulSoup。 其實就幾行代碼,但但願沒有開發基礎的人也能一會兒看明白,因此大神請繞行。 ####基本環境配置html
- python 版本:2.7
- IDE :pycharm ####相關模塊
import urllib2 import io import random import urllib from bs4 import BeautifulSoup import re import os
####完整代碼python
import urllib2 import io import random import urllib from bs4 import BeautifulSoup import re import os import sys reload(sys) sys.setdefaultencoding('utf8') ''' 遇到不懂的問題?Python學習交流羣:821460695知足你的需求,資料都已經上傳羣文件,能夠自行下載! ''' def getHtml(url): #儘量讓爬蟲顯示爲一個正經常使用戶。若不設置,則發送的請求中,user-agent顯示爲Python+版本 user_agent = [ 'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30', 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)', 'Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)' ] #設置網頁編碼格式,解碼獲取到的中文字符 encoding = "gb18030" #構造http請求頭,設置user-agent header = {"User-Agent":random.choice(user_agent)} #構造發送請求 request = urllib2.Request(url,headers=header) #發送請求,獲取服務器響應回來的html頁面 html = urllib2.urlopen(request).read() #使用beautifulSoup處理的html頁面,相似dom soup = BeautifulSoup(html,from_encoding=encoding) return soup # 獲取整個站點全部圖集的頁碼 def getPageNum(url): soup = getHtml(url) # 直接在站點首頁獲取全部圖集的總頁碼 nums=soup.find_all('a',class_='page-numbers') # 除掉「下一頁」的連接,並獲取到最後一頁 totlePage = int(nums[-2].text) return totlePage #獲取指定頁面下圖集名稱和連接 def getPicNameandLink(url): soup = getHtml(url) meun = [] #相似html dom對象,直接查找id爲「pins」的ul標籤,返回的結果是一個dom對象 targetul = soup.find("ul",id="pins") if targetul: #獲取該ul下全部的超連接,返回值的類型是list,find_all中第二個參數表示某個指定標籤的屬性 pic_list = targetul.find_all("a",target="_blank") if pic_list: # 遍歷全部指定的標籤a for pic in pic_list: #獲取圖集的連接 link = pic["href"] picturename = "" #找到標籤a中,「class」爲「lazy」的img標籤。 #find中,第二個參數表示某個指定標籤的屬性。 #在python中class是保留字,全部標籤的class屬性的名稱爲「class_」 img = pic.find("img",class_='lazy') if img: # 保證中文字符可以正常轉碼。 picturename = unicode(str(img["alt"])) else: continue #插入圖集名稱和對應的url meun.append([picturename,link]) return meun return None #function獲取全部的圖集名稱 def getallAltls(url): totalpage = getPageNum(url) #獲取首頁中全部的圖集名稱。首頁的url和其餘頁面不一樣,沒有page meun = getPicNameandLink(url) #循環遍歷全部的圖集頁面,獲取圖集名稱和連接 for pos in range(2,totalpage): currenturl = url + "/page/" + str(pos) #getPicNameandLink()返回的值是一個list。 #當一個list插入到另外一個list中時,使用extend。 #如果插入一個值時,能夠用append meun.extend(getPicNameandLink(currenturl)) return meun # 獲取從首頁到指定頁面全部的圖集名稱和連接 def getparAltls(url,page): meun = getPicNameandLink(url) for pos in range(2,page): currenturl = url + "/page/" + str(pos) meun.extend(getPicNameandLink(currenturl)) return meun #獲取單個相冊內圖片頁碼 def getSinglePicNum(url): soup = getHtml(url) #pagenavi仍是一個對象(Tag),能夠經過find_all找出指定標籤出來 pagenavi = soup.find("div",class_="pagenavi") pagelink = pagenavi.find_all("a") num = int(pagelink[-2].text) return num #下載單個相冊中的全部圖片 def getSinglePic(url,path): totalPageNum = getSinglePicNum(url) #從第一頁開始,下載單個圖集中全部的圖片 #range()第二個參數是範圍值的上限,循環時不包括該值 #須要加1以保證讀取到全部頁面。 for i in range(1,totalPageNum + 1): currenturl = url + "/" + str(i) downloadpic(currenturl,path) #下載單個頁面中的圖片 def downloadpic(url,path): soup = getHtml(url) #找出指定圖片所在父容器div pageimg = soup.find("div",class_="main-image") if pageimg: #找出該div容器中的img,該容器中只有一個img img = pageimg.find("img") #獲取圖片的url imgurl = img["src"] #獲取圖片的文件名 restring = r'[A-Za-z0-9]+\.jpg' reimgname = re.findall(restring,imgurl) #將圖片保存在指定目錄下 path = str(path) if path.strip() == "": downloadpath = reimgname[0] else: downloadpath = path + "/" + reimgname[0] #假裝一下下載的http請求,不然有些站點不響應下載請求。 #不設置的話,下載請求中的user-agent爲python+版本號 urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0' #下載圖片到指定目錄中,保留圖片在服務器上的文件名 urllib.urlretrieve(imgurl,downloadpath) def downimgofsite(url,path = ""): path = str(path) #獲取全部圖集的名稱和連接 meun_list = getallAltls(url) directorypath = "" for meun in meun_list: directoryname = meun[0] if path.strip() != "": directorypath = path + "/" + directoryname else: directorypath = os.getcwd + "/" + directoryname if not os.path.exists(directorypath): os.makedirs(directorypath) getSinglePic(meun[1], directorypath) if __name__ == "__main__": # page = 8 url = "XXXXX" menu = getallAltls(url) #menu = getparAltls(url, page) f = open("tsts.txt","a") for i in menu: f.write(str(unicode(i[0]))+"\t"+str(i[1])+"\n") f.close()