现在,我一直在尝试刮谷歌图片使用以下代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import os
import time
import requests
import re
import urllib2
import re
from threading import Thread
import json
#Assuming I have a folder named Pictures1, the images are downloaded there.
def threaded_func(url,i):
raw_img = urllib2.urlopen(url).read()
cntr = len([i for i in os.listdir("Pictures1") if image_type in i]) + 1
f = open("Pictures1/" + image_type + "_"+ str(total), 'wb')
f.write(raw_img)
f.close()
driver = webdriver.Firefox()
driver.get("https://images.google.com/")
elem = driver.find_element_by_xpath('/html/body/div/div[3]/div[3]/form/div[2]/div[2]/div[1]/div[1]/div[3]/div/div/div[2]/div/input[1]')
elem.clear()
elem.send_keys("parrot")
elem.send_keys(Keys.RETURN)
image_type = "parrot_defG"
images=[]
total=0
time.sleep(10)
for a in driver.find_elements_by_class_name('rg_meta'):
link =json.loads(a.text)["ou"]
thread = Thread(target = threaded_func, args = (link,total))
thread.start()
thread.join()
total+=1
我试着用Selenium打开谷歌的图片结果页面,然后注意到每个div都有类“rg-meta”,后面跟着JSON代码。
我尝试使用.text访问它。JSON的“ou”索引包含我尝试下载的图像的源代码。我尝试使用类“rg-meta”获取所有此类div并下载图像。但它显示错误**”NO JSON OBJECT CAN BE DECODED”**,我不知道该怎么做。
编辑:这就是我要说的:
<div class="rg_meta">{"cl":3,"id":"FqCGaup9noXlMM:","isu":"kids.britannica.com","itg":false,"ity":"jpg","oh":600,"ou":"http://media.web.britannica.com/eb-media/89/89689-004-4C85E0F0.jpg","ow":380,"pt":"grain weevil -- Kids Encyclopedia | Children\u0026#39;s Homework Help ...","rid":"EusB0pk_sLg7vM","ru":"http://kids.britannica.com/comptons/art-143712/grain-or-granary-weevil","s":"grain weevil","sc":1,"st":"Kids Britannica","th":282,"tu":"https://encrypted-tbn2.gstatic.com/images?q\u003dtbn:ANd9GcQPbgXbRVzOicvPfBRtAkLOpJwy_wDQEC6a2q0BuTsUx-s0-h4b","tw":179}</div>
检查JSON的ou索引,请帮我提取。
原谅我的无知。
这就是我如何通过以下更新来解决这个问题:
for a in driver.find_elements_by_xpath('//div[@class="rg_meta"]'):
atext = a.get_attribute('innerHTML')
link =json.loads(atext)["ou"]
print link
thread = Thread(target = threaded_func, args = (link,total))
thread.start()
thread.join()
total+=1
2条答案
按热度按时间qni6mghb1#
替换:
driver.find_elements_by_class_name('rg_meta')
与driver.find_element_by_xpath('//div[@class="rg_meta"]/text()')
以及
a.text
与a
的关系就能解决你的问题。
生成的代码:
打印link会导致:
lvjbypge2#
由于使用
selenium
进行解析非常耗时,您可以使用BeautifulSoup web抓取库来实现相同的结果。我将向您展示如何从内联JSON解析图像(包括全分辨率的图像),这样会快得多。
由于页面是动态呈现的,我们还需要使用regular expressions从内联JSON中提取数据。
首先,我们可以在页面源代码(
Ctrl+U
)中查找第一张图片的标题,以找到我们需要的匹配项,如果它们在<script>
元素中,那么很可能是内联JSON,从那里我们可以提取数据。接下来,我们通过选择包含所需数据的代码部分来缩小搜索范围:
之后,我们已经找到缩略图和直接原始图像:
在联机IDE中检查完整代码。
输出示例
你也可以使用SerpApi的Google Images API,这是一个免费的付费API,不同的是它会绕过Google的屏蔽(包括CAPTCHA),不需要创建解析器和维护它。
集成示例:
输出:
如果你需要更多的代码解释,有一篇Scrape and download Google Images with Python的博客文章。