我想使用Google图像搜索下载批量图像。
我的第一个方法;将页面源代码下载到一个文件中,然后用open()
打开它可以正常工作,但我希望能够通过运行脚本和更改关键字来获取图像URL。
第一种方法:转到图片搜索(https://www.google.no/search?q=tower&client=opera&hs=UNl&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiM5fnf4_zKAhWIJJoKHYUdBg4Q_AUIBygB&biw=1920&bih=982)。在浏览器中查看页面源代码并将其保存为html文件。当我用脚本对html文件执行open()
时,脚本按预期工作,我得到了搜索页面上所有图片的url的整洁列表。这是脚本的第6行所做的(取消注解以测试)。
然而,如果我使用requests.get()
函数解析网页,如脚本的第7行所示,它会获取一个 * 不同的 * html文档,该文档不包含图像的完整URL,因此我无法提取它们。
请帮我提取图像的正确网址。
编辑:链接到塔.html,我正在使用:https://www.dropbox.com/s/yy39w1oc8sjkp3u/tower.html?dl=0
这是我迄今为止编写的代码:
import requests
from bs4 import BeautifulSoup
# define the url to be scraped
url = 'https://www.google.no/search?q=tower&client=opera&hs=cTQ&source=lnms&tbm=isch&sa=X&ved=0ahUKEwig3LOx4PzKAhWGFywKHZyZAAgQ_AUIBygB&biw=1920&bih=982'
# top line is using the attached "tower.html" as source, bottom line is using the url. The html file contains the source of the above url.
#page = open('tower.html', 'r').read()
page = requests.get(url).text
# parse the text as html
soup = BeautifulSoup(page, 'html.parser')
# iterate on all "a" elements.
for raw_link in soup.find_all('a'):
link = raw_link.get('href')
# if the link is a string and contain "imgurl" (there are other links on the page, that are not interesting...
if type(link) == str and 'imgurl' in link:
# print the part of the link that is between "=" and "&" (which is the actual url of the image,
print(link.split('=')[1].split('&')[0])
3条答案
按热度按时间jum4pzuy1#
你要知道:
我想在我的回答之前说,Google非常依赖脚本。很有可能你得到的结果不同,因为你通过
reqeusts
请求的页面没有使用页面上提供的script
做任何事情,而在Web浏览器中加载页面却可以。Here's what i get when I request the url you supplied
我从
requests.get(url).text
返回的文本中没有任何地方包含'imgurl'
。您的脚本正在将其作为条件的一部分进行查找,但它不存在。但是我确实看到了一堆
<img>
标签,其中的src
属性设置为图像url。如果这就是你想要的,那么试试这个脚本:返回以下结果:
zpgglvta2#
您可以使用'data-src'或'src'属性来寻找属性。
8e2ybdfx3#
你可以使用regular expressions来提取Google图片,因为你需要的数据是动态呈现的,但我们可以在内联JSON中找到它。
为此,我们可以在页面源代码(
Ctrl+U
)中搜索第一个图像标题,找到我们需要的匹配项,如果<script>>
元素中有匹配项,那么它很可能是一个内联JSON。为了找到原始图像,我们首先需要找到缩略图,然后我们需要减去部分解析后的Inline JSON,这将给予一种更简单的方法来解析原始分辨率的图像:
不幸的是,这种方法不可能找到所有的图片,因为它们是通过滚动添加到页面上的。如果你需要收集所有的图片,你需要使用浏览器自动化,如
selenium
或playwright
,如果你不想反向工程的话。有一个
"ijn" URL parameter
定义了要获取的页码(大于或等于0),它与同样位于内联JSON中的分页标记结合使用。在联机IDE中检查代码。
输出示例:
你也可以使用SerpApi的Google Images API。这是一个免费的付费API。不同的是它会绕过Google的块(包括CAPTCHA),不需要创建解析器和维护它。
简单代码示例:
输出量:
如果您需要更多的代码解释,可以参考Scrape and download Google Images with Python博客文章。