我一直在尝试使用Scrapy来恢复query
中Google 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']
答案 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与浏览器中显示的不同。