Selenium返回自定义属性的随机值

时间:2017-01-27 13:58:26

标签: python-3.x selenium selenium-webdriver

我正在尝试从以下网站导出图片网址 https://www.list.am/category/60

在单个公寓的页面上,您可以看到它的图像。

图片的xpath选择器为".//div[@id='pv']//ul/li/img"或css:"div#pv ul > li > img"。当前活动图像的属性设置为src,而其他所有图像都具有自定义属性'x',该属性将正确的src保存到图像中。

因此,我的python代码看起来

from selenium.webdriver.phantomjs import webdriver
driver = webdriver.WebDriver('path/to/driver')

url = 'url/to/any/page/from/the/list'
driver.get(url)
images = driver.find_elements_by_xpath(".//div[@id='pv']//ul/li/img")
for img in images:
    print img.get_attribute('src') or img.get_attribute('x')

仅为第一项打印正确答案。对于其他人,我得到一些随机的4位数字。虽然chrome的开发人员工具显示元素具有正确的值。

在chrome的控制台中,我尝试了

var images = document.querySelectorAll("div#pv ul > li > img");
for(var i = 0; i < images.length; ++i)
{
    console.log(images[i].getAttribute('src') || images[i].getAttribute('x'));
}

这已打印出正确的结果。

尝试使用lxml进行解析,这也按预期工作。

Selenium为Chrome和Phantomjs驱动程序提供属性x的随机值。有什么问题?

操作系统:Ubuntu 14.04

2 个答案:

答案 0 :(得分:1)

首先,让我给你道德免责声明有人显然不希望你刮他们的网页,因此你不应该这样做。 他们似乎非常渴望让其他人这么做,而且可能有充分的理由。因此,如果您对其数据有合法使用,请要求您提供用户友好的API。如果您对数据的使用情况良好,我相信他们会很乐意这样做。

考虑到这一点,纯粹出于技术上的好奇心,为了在这里学习一些东西,让我们仔细看看那个神秘的x

运行element.get_attribute('x')时,您获得的是该DOM对象的x 属性的值。 x与您在Chrome开发者工具(以及页面的源代码中)中看到的x 属性无关。 DOM属性 x实际上是指页面上对象的位置(请注意,还有#{1}}属性。 )

您要检索的是y 属性的值。据我所知,使用WebDriver最简单的方法是使用x和JavaScript方法executeScript。在Java中看起来像这样:

getAttribute

请注意,WebDriver W3C Standard建议同时提供Get Element Attribute以及Get Element Property API,该API应与浏览器内部行为保持一致。所以希望一旦所有驱动程序都实现了标准,并且所有客户端绑定都暴露了这些方法,这应该会更加清晰。

答案 1 :(得分:1)

老实说,如果你想抓取图片网址,selenium对于这样的任务来说有点笨拙。我强烈建议使用requests进行抓取,使用BeautifulSoup进行解析和提取。

在你的情况下:

import requests
from bs4 import BeautifulSoup as soup

response = requests.get('https://www.list.am/category/60')
html = soup(response.text, 'lxml')

imgs = html.select('td img')

for img in imgs:
    print img['src']

结果:

//a5m4x4y3.ssl.hwcdn.net/r/600/16639600.jpg
//a5m4x4y3.ssl.hwcdn.net/r/284/15251284.jpg
//a5m4x4y3.ssl.hwcdn.net/r/928/12968928.jpg
//a5m4x4y3.ssl.hwcdn.net/r/144/12331144.jpg
//a5m4x4y3.ssl.hwcdn.net/r/273/16737273.jpg
//a5m4x4y3.ssl.hwcdn.net/r/496/14458496.jpg
//a5m4x4y3.ssl.hwcdn.net/r/764/15412764.jpg
//a5m4x4y3.ssl.hwcdn.net/r/504/15517504.jpg
//a5m4x4y3.ssl.hwcdn.net/r/267/11907267.jpg
//a5m4x4y3.ssl.hwcdn.net/r/066/11907066.jpg
//a5m4x4y3.ssl.hwcdn.net/r/154/16306154.jpg
//a5m4x4y3.ssl.hwcdn.net/r/892/11906892.jpg
//a5m4x4y3.ssl.hwcdn.net/r/103/11899103.jpg
//a5m4x4y3.ssl.hwcdn.net/r/186/12070186.jpg
//a5m4x4y3.ssl.hwcdn.net/r/920/12069920.jpg
//a5m4x4y3.ssl.hwcdn.net/r/246/16666246.jpg
//a5m4x4y3.ssl.hwcdn.net/r/831/12069831.jpg
//a5m4x4y3.ssl.hwcdn.net/r/470/12067470.jpg
//a5m4x4y3.ssl.hwcdn.net/r/718/12067718.jpg
//a5m4x4y3.ssl.hwcdn.net/r/398/12067398.jpg
//a5m4x4y3.ssl.hwcdn.net/r/240/12067240.jpg
//a5m4x4y3.ssl.hwcdn.net/r/130/12067130.jpg
//a5m4x4y3.ssl.hwcdn.net/r/924/12066924.jpg
//a5m4x4y3.ssl.hwcdn.net/r/341/16600341.jpg
//a5m4x4y3.ssl.hwcdn.net/r/449/8614449.jpg
//a5m4x4y3.ssl.hwcdn.net/r/853/16597853.jpg
//a5m4x4y3.ssl.hwcdn.net/r/335/16759335.jpg
//a5m4x4y3.ssl.hwcdn.net/r/824/13520824.jpg
//a5m4x4y3.ssl.hwcdn.net/r/292/16613292.jpg
//a5m4x4y3.ssl.hwcdn.net/r/951/13532951.jpg
//a5m4x4y3.ssl.hwcdn.net/r/584/17137584.jpg
//a5m4x4y3.ssl.hwcdn.net/r/051/17111051.jpg
//a5m4x4y3.ssl.hwcdn.net/r/482/17042482.jpg
//a5m4x4y3.ssl.hwcdn.net/r/542/17110542.jpg
//a5m4x4y3.ssl.hwcdn.net/r/145/16998145.jpg
//a5m4x4y3.ssl.hwcdn.net/r/083/17012083.jpg
//a5m4x4y3.ssl.hwcdn.net/r/723/17110723.jpg
//a5m4x4y3.ssl.hwcdn.net/r/369/17013369.jpg
//a5m4x4y3.ssl.hwcdn.net/r/460/17127460.jpg
//a5m4x4y3.ssl.hwcdn.net/r/872/16560872.jpg
//a5m4x4y3.ssl.hwcdn.net/r/142/11467142.jpg
//a5m4x4y3.ssl.hwcdn.net/r/831/17004831.jpg
//a5m4x4y3.ssl.hwcdn.net/r/446/16664446.jpg
//a5m4x4y3.ssl.hwcdn.net/r/738/14977738.jpg
//a5m4x4y3.ssl.hwcdn.net/r/031/16845031.jpg
//a5m4x4y3.ssl.hwcdn.net/r/610/17085610.jpg
//a5m4x4y3.ssl.hwcdn.net/r/502/17004502.jpg