2017-10-12 18 views
0

我想从以下网址:(https://www.strongmotioncenter.org/cgi-bin/CESMD/Multiplesearch1_DM2.pl?event_name=&magmin=&magmax=&byear=&eyear=&country=Any&state=Any&stn_ident=&type=BLD&Material=Concrete&Height=&siteclass=Any&accmin=&accmax=&hdistmin=&hdistmax=我找不到通过webdriver的,硒正确的图像(.JPG),并beautifulsoup

你可以看到下站列中的链接下载数百张照片,我想自动点击它并在新浏览器中找到jpg(左侧)文件,然后下载它。

我用jupyter笔记本写我的Python代码,如下图所示:

from selenium import webdriver 
from selenium.webdriver.support.ui import Select 
from bs4 import BeautifulSoup 
import urllib.request 
import requests 
chrome=webdriver.Chrome('/Users/user/Downloads/software 
/chromedriver_win32/chromedriver') 

chrome.get("https://www.strongmotioncenter.org/cgi- 
bin/CESMD/Multiplesearch1_DM2.pl? 
event_name=&magmin=&magmax=&byear=&eyear 
=&country=Any&state=Any&stn_ident=&type=BLD&Material 
=Concrete&Height=&siteclass=Any&accmin=&accmax=&hdistmin=&hdistmax=") 

stations = chrome.find_element_by_css_selector('.xlink') 
stations.click() 
url_link = chrome.current_url 
soup = BeautifulSoup(urllib.request.urlopen(url_link),"lxml") 
figure = soup.find_all('.jpg') 
print(figure) 

它总是打印出什么。但是,如果我写的:

figure = soup.find_all('img') 

它将返回:

[<img onclick="url(&quot;'+" processed="" 
src="../../NCESMD/images/save_32.gif"/>, <img onclick="url(&quot;'+" raw="" 
src="../../NCESMD/images/save_32.gif"/>] 

这是不是我想要的图像文件。

我真的不知道发生了什么事。

谢谢你的时间。我真的很感激。

+1

有一个在使用浏览器F12工具的网站。查看网络活动和JavaScript的用法。 –

回答

0

我尝试了Java,你可以使用相同的方法。我们所有的

首先把所有的网页元素与类名的XLink

List<WebElement> xlinks = driver.findElements(By.className("xlink")); 

对于这些元素,我们必须创建站选择网址。 为了做到这一点,我们知道一个URL是这样的:

https://www.strongmotioncenter.org/cgi-bin/CESMD/stationhtml.pl?staID=CE34234&network=CGS

第一部分是 “静态”:

String stationSelectUrl = "https://www.strongmotioncenter.org/cgi-bin/CESMD/stationhtml.pl?"; 

第二个没有:

staID=CE34234&network=CGS 

关于第二部分的信息是在“onclick”属性中。

在这个例子中:

onclick="openwin('CE34234','CGS')" 

所以,用这种方式,我们可以创造一切intrested网址。

对于这些网址,我们必须得到包含IMAGEURL的Web元素,并进行下载:

  WebElement img = driver2.findElement(By.xpath("/html/body/div[2]/center/table/tbody/tr[1]/td[1]/font/a/img")); 
      String imageid = img.getAttribute("src"); 
      downloadFile(imageid); 

为了下载文件,我用卷曲命令。

整个代码:

public class SeleniumTest { 
public static void main(String args[]) throws UnsupportedEncodingException, InterruptedException { 
     WebDriver driver; 
     driver = new FirefoxDriver(); 
     String vURL = "https://www.strongmotioncenter.org/cgi-bin/CESMD/Multiplesearch1_DM2.pl?event_name=&magmin=&magmax=&byear=&eyear=&country=Any&state=Any&stn_ident=&type=BLD&Material=Concrete&Height=&siteclass=Any&accmin=&accmax=&hdistmin=&hdistmax="; 
     driver.get(vURL); 
     List<WebElement> xlinks = driver.findElements(By.className("xlink")); 
     int i = 1; 
     String stationSelectUrl = "https://www.strongmotioncenter.org/cgi-bin/CESMD/stationhtml.pl?"; 

     WebDriver driver2 = new FirefoxDriver(); 
     for (WebElement xlink : xlinks) { 
      System.out.println(xlink.getText()); 
      String onclick = xlink.getAttribute("onclick"); 
      System.out.println("onclick: " + onclick); 
      String relativeUrl = getStationSelected(onclick); 
      System.out.println("relativeUrl: " + relativeUrl); 
      System.out.println("------------" + i + "------------------"); 
      i++; 
      driver2.get(stationSelectUrl + relativeUrl); 
      driver2.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

      WebElement img = driver2.findElement(By.xpath("/html/body/div[2]/center/table/tbody/tr[1]/td[1]/font/a/img")); 
      String imageid = img.getAttribute("src"); 
      downloadFile(imageid); 

     } 

     driver2.close(); 
     driver.close(); 
    } 


    private static String getStationSelected(String onclick) { 
     StringTokenizer st = new StringTokenizer(onclick, "'"); 
     st.nextToken(); 
     String statID = st.nextToken(); 
     st.nextToken(); 
     String network = st.nextToken(); 
     onclick = "staID=" + statID + "&network=" + network; 
     return onclick; 
    } 

    private static void downloadFile(String file) { 
     try { 
      String[] CMD_COMPOSED = { 
        "/bin/bash", 
        "-c", 
        "curl -O " + file,}; 

      Process p = Runtime.getRuntime().exec(CMD_COMPOSED); 
      System.out.println("File " + file + " downloaded!"); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 


} 
+0

非常感谢!我已经解决了这个问题,但我仍然使用python的selemium和webdriver来下载照片。我非常感谢你的时间和代码,我会尝试修改我的代码并尝试使用javascript(我只有很少的JavaScript经验)。 –