2017-08-01 66 views
0

所以我正在嘗試做一個小爬蟲來挑選幾個Google搜索圖片鏈接,然後下載它們。這不會是每天1000次查詢需要運行1000次的任何事情,而只是一個簡單的腳本,可以爲特定搜索詞下載第一批圖像。只使用BeautifulSoup獲取特定尺寸的圖像

對於我有以下代碼:

import requests 
from bs4 import BeautifulSoup 
import json 
import urllib 

s = requests.session() 
s.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"}) 

URL = "https://www.google.dk/search" 

def get_images(query, start): 
    images = [] 

    screen_width = 1920 
    screen_height = 1080 
    params = { 
     "q": query, 
     "sa": "X", 
     "biw": screen_width, 
     "bih": screen_height, 
     "tbm": "isch", 
     "ijn": start/100, 
     "start": start, 
     #"ei": "" - This seems like a unique ID, you might want to use it to avoid getting banned. But you probably still are. 
    } 

    request = s.get(URL, params=params) 
    bs = BeautifulSoup(request.text, "lxml") 

    for img in bs.findAll("div", {"class": "rg_meta"}): 
     js = json.loads(img.text) 

     images.append(js['ou']) 


    return images 

所以基本上我得到一個鏈接列表,然後我就可以通過解析,並通過這個代碼下載它連名字從1到有多少是圖像現在正在爬行:

searchlist = ["cats"] #search strings 
nr_img = 5 #number of images to be crawled 

for k, searchstring in enumerate(searchlist): 
    k += 0 
    images = get_images("{}".format(searchstring), 0) 

    img_nr_list = [] 
    for n, x in enumerate(images[0:nr_img]): 
     n += 1+k*nr_img 
     urllib.urlretrieve("{}".format(x), "\foo\bar\{}.jpg".format(n)) 
     img_nr_list.append("{}.jpg".format(n)) 

原則上相當簡單。但是,我的問題是,一些圖像只是縮略圖,或者只是具有較低的圖像大小。所以我的問題是:有沒有辦法讓我可以這樣說:「如果寬度< 600px和高度< 400px然後跳過」或類似的東西?

+1

直到你下載它,你不能告訴圖像的大小。 – Barmar

+0

但Google可以嗎?您可以在搜索時設置圖像大小,對吧?所以在這裏不應該這樣做,或者......? –

+0

聽起來像你想要一個會話,並可能切換幾個設置來篩選圖像大小。我非常懷疑谷歌提供了一個API來從他們的網站上抓取圖片,尤其是在圖片大小設置方面,考慮到他們明確禁止從他們的抓取中抓取圖片。 –

回答

0

我不知道如何與beautifulsoup做到這一點,但另一個Python庫調用ImageScraper,讓你定義最大圖像尺寸

https://pypi.python.org/pypi/ImageScraper

我只測試了它使用命令行工具,因爲它的Python 2.7,我通常在Python 3 +

+1

這限制了圖像大小(以字節爲單位),這可能與給定DPI或圖像類型的寬度和高度相關,但不是完美的相關性。這需要啓發式和分類器來確定圖像在下載之前是否可能高於或低於給定的寬度/高度。 –