selenium 实现爬虫

1下载

selenium-server-standalone-2.41.0.jar

chromedriver_win32.zip

 IEDriverServer_x64_2.42.0.zip

    

2设置环境

1)解压chromedriver_win32.zip,把chromedriver.exe拷贝至C:/ selenium/chrome/

2)解压IEDriverServer_x64_2.42.0.zip把IEDriverServer.exe拷贝至C:/ selenium/ie/

3)ie驱动的路径加入至环境变量PATH

 

3 代码示例

 建java工程,添加jar包selenium-server-standalone-2.41.0.jar。

3.1 baidu

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
    private static void example() 
    {
    	//for firefox
        //WebDriver driver = new FirefoxDriver();

    	//for chrome 
    	System.setProperty("webdriver.chrome.driver", "C:/ selenium/chrome/chromedriver.exe");
    	WebDriver driver = new ChromeDriver();
    	
    	//for IE
    	//WebDriver driver = new InternetExplorerDriver();

    	WebDriverWait w = new WebDriverWait(driver, 10);
    	
        driver.get("http://www.baidu.com/");  
        // 等价于    driver.navigate().to("http://www.baidu.com/");

        w.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw1")));
        w.until(ExpectedConditions.elementToBeClickable(By.id("su1")));
        
        // Find the text input element by its name
        WebElement element = driver.findElement(By.id("kw1"));
        element.sendKeys("liaoxiangui");

        element.submit();  
       //WebDriver会自动的找element对应的form,并提交. 等价于:   
       //driver.findElement(By.id("su1")).click();

        System.out.println("Page title is: " + driver.getTitle());
        
        // baidu's search is rendered dynamically with JavaScript.
        // Wait for the page to load, timeout after 10 seconds
        w.until(new ExpectedCondition<Boolean>() {public Boolean apply(WebDriver d) {return d.getTitle().toLowerCase().startsWith("liaoxiangui");}});
        
        System.out.println("Page title is: " + driver.getTitle());
        
        try{Thread.sleep(10000);}catch(Exception e){}
        
        //Close the browser
        driver.quit();
    }

3.2 一号店

private static void yihaodian()
{
	System.setProperty("webdriver.chrome.driver", "C:/work/research/bijia/selenium/chromedriver_win32/chromedriver.exe");
	
	ChromeOptions options = new ChromeOptions();
	//options.addArguments("--disable-images");
	WebDriver driver = new ChromeDriver(options);
    
	try
	{
	driver.get("http://www.yhd.com/ctg/s2/c21289-0-60761/b/a-s1-v0-p15-price-d0-f0-m1-rt0-pid-mid0-k/#page=1&sort=1");
        
	Boolean first = true;
        int products=0;
        WebDriverWait ww = new WebDriverWait(driver, 10);
        
        while(true)
        {	
            System.out.println("processing filter page:"+driver.getCurrentUrl());
        	
            if(first)
            {
            	first=false;
	            ww.until(ExpectedConditions.presenceOfElementLocated(By.id("startShopping")));		            

	            WebElement s = driver.findElement(By.id("selectProvince"));
	            s.click();
	            s = driver.findElement(By.id("p_13"));
	            s.click();
	            s = driver.findElement(By.id("startShopping"));
	            s.click();
            }
            
            ww.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("#itemSearchList > li")));
             //窗口最大化。 必须使得那个按钮在屏幕上可见,否则会抛异常?
            //driver.manage().window().maximize();
            final int liCounter = driver.findElements(By.cssSelector("#itemSearchList > li")).size();		        
	        for(int kk=0;kk<liCounter;kk++)
	        {	
	        	try
	        	{
		        	String cssStr = "#itemSearchList > li:nth-of-type("+(kk+1)+")";
		        	WebElement li = driver.findElement(By.cssSelector(cssStr));;
		        	products++;
		        	
		        	String t;

		        	try{
		        	ww.until(ExpectedConditions.visibilityOf(li.findElement(By.cssSelector(".owner > a"))));
		        	t = li.findElement(By.cssSelector(".owner > a")).getAttribute("title");
		        	System.out.println("vendor name="+t);
		        	}
		        	catch(NoSuchElementException e)
		        	{
		        		System.out.println("vendor=自营");
		        	}
		        	
		        	
		        	ww.until(ExpectedConditions.visibilityOf(li.findElement(By.className("electrical_item_box"))));
		        	t = li.findElement(By.className("electrical_item_box")).getAttribute("comproid");
		        	System.out.println("selfid="+t);
		        	
		        	ww.until(ExpectedConditions.visibilityOf(li.findElement(By.cssSelector("div > .search_prod_img > img"))));
		        	t = li.findElement(By.cssSelector("div > .search_prod_img > img")).getAttribute("src");
		        	System.out.println("pic url="+t);
		        	
		        	ww.until(ExpectedConditions.visibilityOf(li.findElement(By.cssSelector(".title > .title"))));
		        	t = li.findElement(By.cssSelector(".title > .title")).getText();
		        	System.out.println("title="+t);
		        	
		        	t = li.findElement(By.cssSelector(".title > .title")).getAttribute("href");
		        	System.out.println("detailed url="+t);

		        	ww.until(ExpectedConditions.visibilityOf(li.findElement(By.className("color_red"))));
		        	t = li.findElement(By.className("color_red")).getText();
		        	System.out.println("price="+t);
	        	}
	        	catch(StaleElementReferenceException ex) //see http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp
	        	{
	        		kk--;
	        		System.out.println("stale element. retry to get it.");
	        	}
	        	//break;
	        }
	        
	        
	        WebElement ne = null;
	        while(true)
	        {
	        	try
	        	{
			        ww.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#rankOpDiv")));
			        //如果找不到指定的element,selenium的做法是抛异常。
		        	ne = driver.findElement(By.cssSelector("#rankOpDiv .select_page_btn a.next")); //throw NoSuchElementException
		        	ww.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#rankOpDiv a.next")));
		        	ne.click();
	        	}
	        	catch(StaleElementReferenceException ex)
	        	{
	        		System.out.println("retry  going to next page.");
	        		continue;
	        	}
	        	catch(NoSuchElementException e)
	        	{
	        		System.out.println("this category end!");
	        	}
	        	break;
	        }
	        
        	
	        if(ne == null)
	        	break;
        }
        
        System.out.println("get "+products+" products.");
	}
	catch(Exception ex)
	{
		System.out.println(ex);
	}
    
    //Close the browser
    driver.quit();
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值