从谷歌图片搜索下载图片(python)

2 投票
4 回答
8385 浏览
提问于 2025-04-18 16:02

我是一名刚开始学习网页抓取的新手。首先,我参考了这个视频https://www.youtube.com/watch?v=ZAUNEEtzsrg,学习如何下载带有特定标签的图片(比如的图片),这个方法是有效的!但是,我遇到了一个新问题,只能下载大约100张图片。这个问题看起来像是“ajax”,因为它只加载了第一页的HTML,而没有加载所有内容。因此,似乎我们必须模拟向下滚动才能下载接下来的100张或更多的图片。

我的代码在这里:https://drive.google.com/file/d/0Bwjk-LKe_AohNk9CNXVQbGRxMHc/edit?usp=sharing

总结一下,我面临的问题有:

  1. 如何通过Python的源代码下载谷歌图片搜索中的所有图片(请给我一些例子 :))

  2. 有没有我必须了解的网页抓取技巧?

4 个回答

0

如果你想得到100个结果,可以试试这个:

from urllib import FancyURLopener
import re
import posixpath
import urlparse 

class MyOpener(FancyURLopener, object):
    version = "Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"

myopener = MyOpener()

page = myopener.open('https://www.google.pt/search?q=love&biw=1600&bih=727&source=lnms&tbm=isch&sa=X&tbs=isz:l&tbm=isch')
html = page.read()

for match in re.finditer(r'<a href="http://www\.google\.pt/imgres\?imgurl=(.*?)&amp;imgrefurl', html, re.IGNORECASE | re.DOTALL | re.MULTILINE):
    path = urlparse.urlsplit(match.group(1)).path
    filename = posixpath.basename(path)
    myopener.retrieve(match.group(1), filename)

我可以调整 biw=1600&bih=727 这个参数来获取更大或更小的图片。

0

使用谷歌的API来获取搜索结果,所以你可以把你的网址换成下面这样的:

https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=cat&rsz=8&start=0

这样你会得到8个结果,然后你可以再调用一次这个服务,把start参数改成7,这样就能获取下一个结果,依此类推,直到你收到错误信息为止。

返回的数据是JSON格式的。

这里有一个我在网上找到的Python示例:

import urllib2
import simplejson

url = ('https://ajax.googleapis.com/ajax/services/search/images?' +
       'v=1.0&q=barack%20obama&userip=INSERT-USER-IP')

request = urllib2.Request(url, None, {'Referer': /* Enter the URL of your site here */})
response = urllib2.urlopen(request)

# Process the JSON string.
results = simplejson.load(response)
# now have some fun with the results...

关于网页抓取的技术,这里有一个页面可以参考:

http://jakeaustwick.me/python-web-scraping-resource

希望这些对你有帮助。

1

如果你对 icrawler 有任何问题,可以在Github上提问,这样可能会得到更快的回复。

谷歌搜索结果的数量限制似乎是1000条。一个解决办法是定义一个日期范围,像下面这样。

from datetime import date
from icrawler.builtin import GoogleImageCrawler

google_crawler = GoogleImageCrawler(
    parser_threads=2, 
    downloader_threads=4,
    storage={'root_dir': 'your_image_dir'})
google_crawler.crawl(
    keyword='sunny',
    max_num=1000,
    date_min=date(2014, 1, 1),
    date_max=date(2015, 1, 1))
google_crawler.crawl(
    keyword='sunny',
    max_num=1000,
    date_min=date(2015, 1, 1),
    date_max=date(2016, 1, 1))
4

我最终的解决方案是使用 icrawler

from icrawler.examples import GoogleImageCrawler

google_crawler = GoogleImageCrawler('your_image_dir')
google_crawler.crawl(keyword='sunny', offset=0, max_num=1000,
                     date_min=None, date_max=None, feeder_thr_num=1,
                     parser_thr_num=1, downloader_thr_num=4,
                     min_size=(200,200), max_size=None)

这个框架的好处是它内置了5个爬虫(分别是谷歌、必应、百度、Flicker 和通用爬虫),不过从谷歌爬取时,它最多只能提供100张图片。

撰写回答