爬取妹子圖(requests + BeautifulSoup),
---恢複內容開始---
剛剛入門爬蟲,今天先對於單個圖集進行爬取,過幾天再進行翻頁爬取。
使用requests庫和BeautifulSoup庫
目標網站:妹子圖
今天是對於單個圖集的爬取,就選擇一個進行爬取,我選擇的連結為:http://www.mzitu.com/123114
首先網站的分析,該網站有一定的反爬蟲策略,所以應對就是加入headers(目前是小白,目前不知道具體為毛這樣做)
Hostreferer = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer':'http://www.mzitu.com'}Picreferer = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer':'http://i.meizitu.net'}
前一個頭作為請求網站,後一個頭作為破解盜鏈使用
獲得頁面HTML代碼
用requests庫的get方法,加上Hostreferer
def get_html(url):#獲得頁面html代碼 req = requests.get(url, headers=Hostreferer) html = req.text return html
獲得圖集名稱以及圖集最大頁數
分析網頁構成,圖集名稱包含在h2標籤內,且該標籤在整個HTML代碼裡有唯一的class="main-title",
而最大頁數只是被span標籤包含,無法通過屬性來提取。所以提取圖集名稱採取標籤名+屬性名稱一起提取,而最大頁數就採取將span標籤全部找出,最大頁數在span標籤中第11位,
def get_page_name(url):#獲得圖集最大頁數和名稱 html = get_html(url) soup = BeautifulSoup(html, 'lxml') span = soup.findAll('span') title = soup.find('h2', class_="main-title") return span[10].text, title.text
獲得圖片url連結
分析頁面內容,含有圖片連結的img標籤中有一個alt屬性的值是跟圖集名稱相同,可以用這個來直接找到這個標籤,當然也可以先找到div標籤中的class屬性是main-inage,再找到img的src屬性,這裡我就採用第一種方法。
def get_img_url(url, name): html = get_html(url) soup = BeautifulSoup(html, 'lxml') img_url = soup.find('img', alt= name) return img_url['src']
將圖片存入本地
得到圖片url連結之後要講圖片存到本地,在請求圖片url的時候要加入Picreferer,否則網站會認為你是一個爬蟲,會返還給你一個盜鏈圖
該方法傳入的參數有3個,第一個是圖片url,第二個當前圖片的頁數,用作建立檔案,第三個是圖集名稱,在儲存之前先建立了一個名稱是圖集名稱的檔案夾,這樣就能將圖片存入指定檔案夾
def save_img(img_url, count, name): req = requests.get(img_url, headers=Picreferer) with open(name+'/'+str(count)+'.jpg', 'wb') as f: f.write(req.content)
完整代碼
import requestsfrom bs4 import BeautifulSoupimport osHostreferer = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer':'http://www.mzitu.com'}Picreferer = { 'User-Agent':'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Referer':'http://i.meizitu.net'}def get_page_name(url):#獲得圖集最大頁數和名稱 html = get_html(url) soup = BeautifulSoup(html, 'lxml') span = soup.findAll('span') title = soup.find('h2', class_="main-title") return span[10].text, title.textdef get_html(url):#獲得頁面html代碼 req = requests.get(url, headers=Hostreferer) html = req.text return htmldef get_img_url(url, name): html = get_html(url) soup = BeautifulSoup(html, 'lxml') img_url = soup.find('img', alt= name) return img_url['src']def save_img(img_url, count, name): req = requests.get(img_url, headers=Picreferer) with open(name+'/'+str(count)+'.jpg', 'wb') as f: f.write(req.content)def main(): old_url = "http://www.mzitu.com/123114" page, name = get_page_name(old_url) os.mkdir(name) for i in range(1, int(page)+1): url = old_url + "/" + str(i) img_url = get_img_url(url, name) #print(img_url) save_img(img_url, i, name) print('儲存第' + str(i) + '張圖片成功')main()
在main方法中先請求到圖集的名稱和最大頁數,並且使用名稱建立一個檔案夾來儲存圖片。再從1到最大頁數做一個for迴圈,
然後圖片的每一頁是 圖集首頁 + / + 當前頁數,得到含有圖片內容的url連結,後面就可以將得到圖片存入本地。
爬取結果
檔案夾名稱即為圖集名稱,內部圖片以頁數作為檔案名稱。
#目前就先進行一個圖集的爬取,後面爬取多個圖集我會儘快更新,有什麼問題可以在下方評論,歡迎大家討論。