爬取妹子圖(requests + BeautifulSoup),

來源:互聯網
上載者:User

爬取妹子圖(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連結,後面就可以將得到圖片存入本地。

 

爬取結果

 

  檔案夾名稱即為圖集名稱,內部圖片以頁數作為檔案名稱。

 

 

 

#目前就先進行一個圖集的爬取,後面爬取多個圖集我會儘快更新,有什麼問題可以在下方評論,歡迎大家討論。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.