Scrapy和Xpath到图像链接谷歌图像

时间:2015-07-02 00:57:39

标签: python xpath scrapy

我一直在尝试使用Scrapy来恢复queryGoogle Images的第一张图片的链接。

例如,我一直在尝试恢复此特定查询的第一个链接:Emma Watson - Google Images。为了制定Xpath,我一直在使用 Xpath Helper ,这是 Google Chrome 的扩展。 我试过的第一个XPath如下:

.//*[@id='rg_s']/div[1]/a/@href

在扩展名中返回以下内容:Xpath Helper:

 http://www.google.com/imgres?imgurl=http://images.enstarz.com/data/images/full/15421/emma-watson.jpg&imgrefurl=http://www.styliwallpapers.com/celebrities/emma-watson/&h=2332&w=3500&tbnid=DPhW7CJ1erAD0M:&zoom=1&docid=22MKylYlja8LIM&ei=9oOUVbzdHsShgwTXqYOYBw&tbm=isch&ved=0CBsQMygAMAA

实际上就是我想要的。然后我也会废弃该网址并获取图片的网址。这就是我在寻找的东西。但出于某种原因,我在Scrapy Shell上尝试了Xpath并返回[]。空!

尝试使用其他XPath(到同一个地方):

.//div[@class='rg_di rg_el ivg-i'][1]/a[@class='rg_l']/@href

仍然是相同的答案:[]。 我不知道我做错了什么。你能帮我解决这个问题吗?

PS。我在Scrapy Shell中使用的内容如下:

>response.xpath(".//*[@id='rg_s']/div[1]/a/@href")
# returned: []
>response.xpath(".//div[@class='rg_di rg_el ivg-i'][1]/a[@class='rg_l']/@href")
# returned: []

要添加的内容:当我尝试获取页面标题时,它可以正常工作。

>response.xpath(".//title/text()").extract()
# returns: [u'emma watson - Google Search']

2 个答案:

答案 0 :(得分:2)

根据我使用scrapy view的结果,Google图片实际上默认情况下会加载前20个图片而不使用JavaScript。请尝试使用此XPath:

//table[@class="images_table"]//img/parent::a/@href

如果您需要访问特定图像,请打包img结果并使用索引:

(//table[@class="images_table"]//img)[1]/parent::a/@href

答案 1 :(得分:1)

您是否看过Scrapy中的响应主体?

某些现代网站在加载网站时不会即时加载所有内容,因为响应速度很慢,具体取决于网络和服务器负载,用户最终会查看其他网页。这就是他们使用异步加载资源(AJAX,XHR作为一些关键字)的原因。该网站也是如此。当您在浏览器中调用该站点时,会出现大量网络流量 - 并且还有两个XHR响应。

如果您查看Scrapy中的响应正文,您会发现没有任何元素具有'rg_s',而您正在寻找没有类'rg_di rg_el ivg-i'的人。

如果您打开/复制/下载XHR响应,其中一个包含您在站点中使用XPath Helper找到的URL。

这意味着Scrapy抓取的网站具有一些动态功能,这些功能在抓取时不会执行,并且您下载的HTML与浏览器中显示的不同。