1. 程式人生 > >python網絡數據抓取二(bing圖片抓取)

python網絡數據抓取二(bing圖片抓取)

.get state 練習 code 請求 lee a-z %d 抓取圖片

  上一回嘗試抓取了百度熱點數據,這次繼續選擇利用bing搜索抓取圖片練習下,代碼放在最下供大家參考。程序需要傳入三個參數,圖片關鍵詞、圖片保存路徑、需要抓取的數量。運行過程中可能會有一些錯誤(大部分的是網絡錯誤,比如超時等)我這裏捕獲到只打印出來然後跳過。代碼中翻頁的url請求是抓包獲取到的(沒有寫全,有幾個參數不知道什麽意思去掉了..),然後就是分析返回的html提取想要的數據。下面是我運行的一次結果供參考:

技術分享圖片

結果:

技術分享圖片

源碼:

 1 # -*- coding: UTF-8 -*-
 2 
 3 from bs4 import BeautifulSoup
 4 import urllib.request
5 import requests 6 import time 7 import json 8 import sys 9 import re 10 import os 11 12 13 #爬取目標網站url 14 CRAWL_TARGET_URL = https://cn.bing.com/images/async?q=%s&first=%d&count=%d&relp=%d&lostate=r&mmasync=1 15 16 #每次抓取圖片數量(35是此網頁每次翻頁請求數量) 17 NUMS_PER_CRAWL = 35 18 19 #抓取圖片最小大小(單位字節),小於此值拋棄
20 MIN_IMAGE_SIZE = 50000 21 22 23 def get_image(url, path, count): 24 try: 25 u = urllib.request.urlopen(url, timeout=5) 26 t = u.read() 27 if sys.getsizeof(t) < MIN_IMAGE_SIZE: 28 return -1 29 except Exception as e: 30 print(url, e) 31 return
-2 32 #提取圖片格式 33 frmt = url[url.rfind(.):] 34 p = re.compile("^\\.[a-zA-Z]+") 35 m = p.match(frmt) 36 frmt = m.group(0) 37 try: 38 f = open(os.path.join(path, str(count)+frmt), wb) 39 f.write(t) 40 f.close() 41 except Exception as e: 42 print(os.path.join(path, str(count)+frmt), e) 43 return -3 44 return 0 45 46 47 def crawl_data(info, path, num): 48 first = 0 49 count = 0 50 #創建一個會話 51 s = requests.Session() 52 while(count < num): 53 u = CRAWL_TARGET_URL%(info, first, NUMS_PER_CRAWL, NUMS_PER_CRAWL) 54 #3.05s為發送超時時間,10s為接收到數據超時時間 55 req = s.get(url =u, timeout=(3.05, 10)) 56 bf = BeautifulSoup(req.text, "html.parser") 57 imgtags = bf.find_all("a", class_ = "iusc") 58 for e in imgtags: 59 if count == num: 60 return 61 urldict = json.loads(e.get(m)) 62 if get_image(urldict["murl"], path, count) < 0: 63 continue 64 print("第%d張圖片下載完成,總進度%d%%"%(count+1, (count+1)*100/num)) 65 sys.stdout.flush() 66 count =count+1 67 time.sleep(0.01) 68 first = first + NUMS_PER_CRAWL 69 time.sleep(0.1) 70 71 72 ‘‘‘ 73 參數1:搜索關鍵詞 74 參數2:圖片存放路徑 75 參數3:抓取數量 76 ‘‘‘ 77 if __name__ == __main__: 78 tstart = time.time() 79 crawl_data(sys.argv[1], sys.argv[2], int(sys.argv[3])) 80 print("所有圖片下載完畢,總用時%.2fs"%(time.time()-tstart))

python網絡數據抓取二(bing圖片抓取)