1. 程式人生 > >Python使用BeautifulSoup簡單實現爬取妹子mm圖片--初級篇

Python使用BeautifulSoup簡單實現爬取妹子mm圖片--初級篇

先來個效果截圖(屈服在我的淫威之下吧!壞壞...嘿0.0)

因為是簡易版而且是自己寫著玩玩而已,自己也剛學,亦是筆記亦是分享,大佬輕噴就好。主要目的是希望更多人能夠體驗爬取一些seqing圖片的 快樂  ??哈哈

完整程式碼:文末已貼出

應該安裝個bs4的包就可以直接用了!程式碼有詳細註釋的,推薦直接看程式碼,後文是淺薄的講解...

↑加包方法

簡單逐步地講一下是怎麼實現的吧(有點像期末答辯的趕腳...不管了裝逼要緊!)

簡單式爬取一個網站資訊的步驟一般是:

1. 確定一個目標網址targetURL >> 2.分析該網站的HTML程式碼(藉助開發者工具

檢視原始碼;360IE快捷鍵是Ctrl+shift+c,其他瀏覽器進入F12開發者工具應該可見) >> 3. 使用BeautifulSoup獲取想要內容 >> 4.儲存資料   >> ...

本例targetURL

     http://www.mmonly.cc/mmtp/qcmn/237269.html

分析HTML

  • 目標網站編碼格式是gb2312到時候解碼需要稍微注意
  • 一些關鍵識別符號(紅框標出)幫助我們準確找到要使用的資訊

分析得知:

    該網站HTML程式碼,我們知道了每一張大圖本身就是被a 連結標籤包圍的,而大圖的src屬性就是該圖片的下載地址。

那麼:

     通過獲得<a>標籤中的href屬性我們可以找到下一個網頁,繼續爬取圖片

     通過獲得<img>屬性中的src屬性,我們可以將大圖下載並儲存在本地。

使用BeautifulSoup獲取想要內容

   用本例中的程式碼來大致說明一下基本步驟與使用:

#1.導包

    from bs4 import BeautifulSoup

#2.新建物件,第一個引數HTML原始碼,第二個引數是解析器類別
    soup = BeautifulSoup(html, 'html.parser')

#3.查詢  ,
     Divs = soup.find_all('div',attrs={'id':'big-pic' })#從soup物件中,查詢 'id'='big-pic'  的div 標籤 , 返回值是Tag型別

     picLink = (div.find('a').find('img')['src'])#查詢div中的a標籤中的img標籤中的src屬性 ,  返回值是str

本例我們最想要的就是picLink了(圖片下載地址),有了picLink,我們就可以利用它下載並儲存圖片放置本地了。

儲存資料

   上一步已經獲取了想要的下載連結,最後一步就是下載儲存了。如下

執行效果:

本例完整程式碼:

import urllib.request
from bs4 import BeautifulSoup
import os

def Download(url,picAlt,name):
    path = 'D:\\pythonDemo____________爬蟲____________\\'+picAlt+'\\'
    if not os.path.exists(path):#判斷系統是否存在該路徑,不存在則建立
        os.makedirs(path)
    urllib.request.urlretrieve( url, '{0}{1}.jpg'.format(path, name))  # ,下載圖片儲存在本地

header = {
    "User-Agent":'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',

    'Accept': '*/*',
    'Accept-Language': 'en-US,en;q=0.8',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive'
    """
        使用者代理(User-Agent):用於偽裝程式不是爬蟲,讓伺服器以為你是一個正常使用者。
            是一種向訪問網站提供你所使用的瀏覽器型別、作業系統及版本、CPU 型別、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等資訊的標識。
            UA字串在每次瀏覽器 HTTP 請求時傳送到伺服器
    """
}
def run(targetUrl, beginNUM ,endNUM):
    req = urllib.request.Request(url=targetUrl,headers=header)
    response = urllib.request.urlopen(req)#這裡的req可看成一種更為高階的URL
    html = response.read().decode('gb2312','ignore')#解碼 得到這個網頁的html原始碼:這個網站的編碼使用的是GB2312格式,更常見的網站編碼格式應該是UTF-8了吧
    soup = BeautifulSoup(html, 'html.parser')#將得到的HTML程式碼使用python自帶的解析器(也可以使用lxml解析器,效能會更好,本程式碼從簡
    Divs = soup.find_all('div',attrs={'id':'big-pic' })#使得條件唯一,找到我們想要下載的目標。這裡語法是bs,主流的解析搜尋方式有:bs,xpath和正則 ,小白還是用bs吧
    nowpage = soup.find('span',attrs={'class':'nowpage'}).get_text()#獲取當前頁碼
    totalpage= soup.find('span',attrs={'class':'totalpage'}).get_text()#獲取所有頁
    if beginNUM ==endNUM :#跳出條件
        return
    for div in Divs:#遍歷所有大圖所在的div,其實只有一個元素。因為前面使用的是find_all()方法得到的是集合,所以這要遍歷了。有點不太實用 因為與照顧到語法使用全面的意思
        beginNUM = beginNUM+1

        if div.find("a") is None :#如果這張圖片沒有下一張圖片的連結
            print("沒有下一張了")
            return
        elif div.find("a")['href'] is None or div.find("a")['href']=="":#有連結,但是是 空連結
            print("沒有下一張了None")
            return
        print("=====================================================下載資訊:總進度:",beginNUM,"/",endNUM," ,正在下載套圖:(",nowpage,"/",totalpage,")====================================")

        if int(nowpage)<int(totalpage):#nowpage,totalpage是str型別;(如果不轉換成int來比較的話,totalPage是字串“12”無法與‘1’‘2’這些單個字元的字串比較)
            nextPageLink ="http://www.mmonly.cc/mmtp/qcmn/" +(div.find('a')['href'])
        elif int(nowpage)==int(totalpage):
            nextPageLink = (div.find('a')['href'])

        picLink = (div.find('a').find('img')['src'])#本網站大圖的SRC屬性是下一張圖片的連結
        picAlt = (div.find('a').find('img'))['alt']#圖片的名字alt屬性
        print('下載的圖片連結:',picLink)
        print('套圖名:[ ', picAlt , ' ] ')
        print('開始下載...........')
        Download(picLink,picAlt, nowpage)
        print("下載成功!")
        print('下一頁連結:',nextPageLink)
        run(nextPageLink,beginNUM ,endNUM)#遞迴
        return

#################################main 函式########################################
if __name__ == '__main__':
    #可以是這個網站(http://www.mmonly.cc/mmtp/qcmn/)下的任意一個網址(如下)開始爬取,means爬取的起點()
    # targetUrl ="http://www.mmonly.cc/mmtp/qcmn/258345_2.html"
    # targetUrl ="http://www.mmonly.cc/mmtp/qcmn/259676_8.html"
    targetUrl ="http://www.mmonly.cc/mmtp/qcmn/237269.html"
    run(targetUrl,beginNUM=0,endNUM=60)#設定下載圖片數量:endNUM-beginNUM 數字相減為總數量
    print("【【【【       OVER!        】】】】】")