學了前面幾篇圖形檔操作程式,卻沒有練習的對象?沒關係,在這一篇中教大家去到處抓一抓。

感謝【大數學堂】網頁David老師的熱心分享,看完之後真的是獲益良多,所以在這裡也要回饋一下,把在那裡學到的再進一步發揮,讓砍圖的程式更好操作。這裡所說的砍圖,我也不知道我們這一代的用語和現在的年輕人用語是否一樣,但是這裡的意思當然不是把網頁上的圖形檔都刪除的意思,相反的,是把整個網頁中所有的圖形檔一口氣砍回家,放在自家的硬碟目錄中。程式執行的方法很簡單,找到一個目標網頁(有很多圖檔在同一個網頁上顯示的)targetURL,然後執行下列的程式:

python fetchpics.py targetURL

如果這個網頁是符合我們分析的對象的格式的話,你就會看到一大堆圖形檔的名稱在網頁上一個一個顯示出來,所有被鎖定的圖形檔,都會被存放在pics的資料夾中。要執行這個程式,你的Python要安裝有requests和BeautifulSoup4,安裝方法如下:

$ pip install requests
$ pip install BeautifulSoup4

程式如下:

# Author: skynet
# E-mail: skynet.tw@gmail.com
# Date: 2015/9
# Programming Lanuage: Python 2.7
#
# Usage: python fetchpics.py targetURL 
#
import requests
import shutil
from bs4 import BeautifulSoup
import sys, os

args = sys.argv
if len(args) < 2:
  print "Please enter a URL to fetch!"
  exit(0)
output_path = "pics/"
if not os.path.exists(output_path):
  os.mkdir(output_path)
turl = args[1]
res = requests.get(turl)
soup = BeautifulSoup(res.text, "html.parser")
count = 0
for img in soup.select('img'):
  fname = img['src'].split('/')[-1]
  fname_length = len(fname)
  if '.jpg' in fname:
    if '?' in fname:
      real_fname = fname.split('?')[0]
    else:
      real_fname = fname
    real_fname = output_path + real_fname
    print real_fname
    res2 = requests.get(img['src'], stream=True)
    res_length = res2.headers['content-length']
    if int(res_length) < 50000: 
      print "--->Too small, discard it!"
      continue
    fp = open(real_fname, 'wb')
    shutil.copyfileobj(res2.raw,fp)
    fp.close()
    del res2
    count = count + 1
print "Total", count , " pictures done."

這個程式會自動把低於50KB大小的檔案略過,如果你覺得有需要,可以自行修改程式中的內容。程式的執行結果如下所示:

cap 2015-09-30 下午9.09.56

(373)

%d 位部落客按了讚: