1. 程式人生 > >PYTHON爬蟲——必應圖片關鍵詞爬取

PYTHON爬蟲——必應圖片關鍵詞爬取

這段時間在實習,在做一些各大網站圖片爬取的工作,基本告一段落,現在分別對百度圖片,google圖片,並應(Bing)圖片三個網站的圖片搜尋結果進行爬取和下載。
首先通過爬蟲過程中遇到的問題,總結如下:
1、一次頁面載入的圖片數量各個網站是不定的,每翻一頁就會重新整理一次,對於資料量大的爬蟲幾乎都需要用到翻頁功能,有如下兩種方式:
1)通過網站上的網址進行重新整理,例如必應圖片:

url = 'http://cn.bing.com/images/async?q={0}&first={1}&count=35&relp=35&lostate=r
&mmasync=1&dgState=x*175_y*
848_h*199_c*1_i*106_r*0'

2)通過selenium來實現模擬滑鼠操作來進行翻頁,這一點會在Google圖片爬取的時候進行講解。
2、每個網站應用的圖片載入技術都不一樣,對於靜態載入的網站爬取圖片非常容易,因為每張圖片的url都直接顯示在網頁原始碼中,找到每張圖片對應的url即可使用urlretrieve()進行下載。然而對於動態載入的網站就比較複雜,需要具體問題具體分析,例如google圖片每次就會載入35張圖片(只能得到35張圖片的url),當滾動一次後網頁並不重新整理但是會再次載入一批圖片,與前面載入完成的都一起顯示在網頁原始碼中。對於動態載入的網站我推薦使用selenium庫來爬取。

對於爬取圖片的流程基本如下(對於可以通過網址實現翻頁或者無需翻頁的網站):
1. 找到你需要爬取圖片的網站。(以必應為例)

這裡寫圖片描述
2. 使用google元素檢查(其他的沒用過不做介紹)來檢視網頁原始碼。

這裡寫圖片描述
3. 使用左上角的元素檢查來找到對應圖片的程式碼。

這裡寫圖片描述
4. 通過觀察找到翻頁的規律(有些網站的動態載入是完全看不出來的,這種方法不推薦)

這裡寫圖片描述
從圖中可以看到標籤div,class=’dgControl hover’中的data-nexturl的內容隨著我們滾動頁面翻頁first會一直改變,q=二進位制碼即我們關鍵字的二進位制表示形式。加上字首之後由此我們才得到了我們要用的url。
5. 我們將網頁的原始碼放進BeautifulSoup中,程式碼如下:

url = 'http://cn.bing.com/images/async?q={0}&first={1}&count=35&relp=35&lostate=r&mmasync=1&dgState=x*175_y*848_h*199_c*1_i*106_r*0'
agent = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.165063 Safari/537.36 AppEngine-Google."}
page1 = urllib.request.Request(url.format(InputData, i*35+1), headers=agent)
page = urllib.request.urlopen(page1)
soup = BeautifulSoup(page.read(), 'html.parser')

我們得到的soup是一個class ‘bs4.BeautifulSoup’物件,可以直接對其進行操作,具體內容自行查詢。
首先選取我們需要的url所在的class,如下圖:
這裡寫圖片描述
波浪線是我們需要的url。
我們由下面的程式碼得到我們需要的url:

if not os.path.exists("./" + word):#建立資料夾
   os.mkdir('./' + word)

for StepOne in soup.select('.mimg'):
    link=StepOne.attrs['src']#將得到的<class 'bs4.element.Tag'>轉化為字典形式並取src對應的value。
    count = len(os.listdir('./' + word)) + 1
    SaveImage(link,word,count)#呼叫函式儲存得到的圖片。

最後呼叫urlretrieve()函式下載我們得到的圖片url,程式碼如下:

 try:
        time.sleep(0.2)
        urllib.request.urlretrieve(link,'./'+InputData+'/'+str(count)+'.jpg')
    except urllib.error.HTTPError as urllib_err:
        print(urllib_err)
    except Exception as err:
        time.sleep(1)
        print(err)
        print("產生未知錯誤,放棄儲存")
    else:
        print("圖+1,已有" + str(count) + "張圖")

這裡需要強調是像前面的開啟網址和現在的下載圖片都需要使用try except進行錯誤測試,否則出錯時程式很容易崩潰,大大浪費了資料採集的時間。
以上就是對單個頁面進行資料採集的流程,緊接著改變url中{1}進行翻頁操作繼續採集下一頁。
資料採集結果如下:
這裡寫圖片描述

有問題請留言。
轉載請註明出處:
http://blog.csdn.net/Hk_john/article/details/78455889
資料採集的速度和成功率非常依賴網路,請選擇網路良好的時候進行採集,同時限制自己的採集速度,避免給被爬網站造成網路負擔(建議夜間進行),遵守網路規章。