恢復內容開始 剛剛入門爬蟲,今天先對於單個圖集進行爬取,過幾天再進行翻頁爬取。 使用requests庫和BeautifulSoup庫 目標網站:妹子圖 今天是對於單個圖集的爬取,就選擇一個進行爬取,我選擇的鏈接為:http://www.mzitu.com/123114 首先網站的分析,該網站有一定的 ...
---恢復內容開始---
剛剛入門爬蟲,今天先對於單個圖集進行爬取,過幾天再進行翻頁爬取。
使用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 requests from bs4 import BeautifulSoup import os 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' } 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 def get_html(url):#獲得頁面html代碼 req = requests.get(url, headers=Hostreferer) html = req.text return html 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'] 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鏈接,後面就可以將得到圖片存入本地。
爬取結果
文件夾名稱即為圖集名稱,內部圖片以頁數作為文件名。
#目前就先進行一個圖集的爬取,後面爬取多個圖集我會儘快更新,有什麼問題可以在下方評論,歡迎大家討論。