摆脱了“心急吃不了热豆腐”的无头苍蝇状态之后,在正式开始认真研究爬虫之前,为了不至于没东西交差,先用selenium模仿着写了一个“类爬虫”。
为什么选择selenium:selenium是一款自动化的测试工具,可以模拟用户对浏览器的操作。这里想强调的是完全的模拟,你甚至可以把他想象为按键精灵。。。。。。。(勿喷,我是菜鸟),当然它还有很多很强大的功能,我暂时没有接触到。但是对于要写爬虫的我来说,最大的优势就是其绕过了“前端渲染”这种页面(即用ajax异步请求数据),因为这种页面用普通的爬虫是没办法扒到数据的,必须要用http请求来模拟ajax请求balabalabala...(正在学习模拟请求),或者是爬虫结合selenium这种自动化的测试工具一起上。
本次测试的网站为 -》www.pinterest.com 一个图片网站,应该为无限的瀑布流网站.....故肯定是采用的ajax请求。
另其登录页面 和 浏览界面的网址是不变的(即是在www.pinterest.com这个网站登录,同样也是在www.pinterest.com进行浏览。),所以需要获取cookie来进行操作。
先贴代码:
public class Test {
public static void main(String[] args) throws InterruptedException {
/*
* 不同浏览器的设置不同,推荐使用火狐浏览器。不推荐使用IE浏览器。
* 此处我用的火狐版本为40.4,selenium版本为2.53.1
*/
System.setProperty("webdriver.firefox.bin", "D:/火狐浏览器/firefox.exe");
System.out.println("start");
WebDriver driver = new FirefoxDriver();
/*
* 由于要设置cookie,所以在设置之前必须就建立连接。
* 否则会报错。Exception in thread "main" org.openqa.selenium.InvalidCookieDomainException: You may only set cookies for the current domain
* 故第一句get是不能少的。
*/
driver.get("https://www.pinterest.com/");
for(Cookie cookie:Test.click("你的账号", "你的密码")){
driver.manage().addCookie(cookie);
}
driver.manage().window().maximize();
driver.get("https://www.pinterest.com/");
/*
* 此处我使用set来去重,当然不是什么好办法。只是这个版本只是最初版
* 之后会再优化
*/
Set<String> result = new HashSet<String>();
int i = 0;
int num = 4600;
while(true){
System.out.println(i++);
Thread.sleep(1000*20); //拖动滚动条之后,休眠,便于网站加载数据
List<WebElement> list = driver.findElements(By.cssSelector("img.pinImg.fullBleed.loaded.fade"));
for(WebElement webElement:list){
String url = webElement.getAttribute("src");
System.out.println("url:"+url);
result.add(url);
}
System.out.println("result.size = "+result.size());
if(list.size() == 0){
break;
}
int roll = num*i;
System.out.println("roll:"+roll);
/*
* 这个方法模拟向下拖动 垂直滚动条
*/
String setscroll = "document.documentElement.scrollTop=" + "" + roll;
JavascriptExecutor jse=(JavascriptExecutor) driver;
jse.executeScript(setscroll);
}
driver.close();
System.out.println("end");
}
/**
* 获取cookie
* @param username
* @param password
* @return
* @throws InterruptedException
*/
public static Set<Cookie> click(String username,String password) throws InterruptedException{
System.setProperty("webdriver.firefox.bin", "D:/火狐浏览器/firefox.exe");
WebDriver driver = new FirefoxDriver();
driver.get("https://www.pinterest.com/");
//driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//Thread.sleep(1000*8);
driver.findElement(By.xpath(".//*[@id='userEmail']")).clear();
driver.findElement(By.xpath(".//*[@id='userEmail']")).sendKeys(username);
driver.findElement(By.xpath(".//*[@id='userPassword']")).clear();
driver.findElement(By.xpath(".//*[@id='userPassword']")).sendKeys(password);
driver.findElement(By.xpath("html/body/div[1]/div[2]/div[1]/div/div/div[2]/div[3]/div[1]/div[3]/div/div[1]/div/div[2]/form/div/ul/div[1]/div[2]/li[2]/div/button")).click();
Thread.sleep(1000*10);
Set<Cookie> cookies = driver.manage().getCookies();
System.out.println("Cookie.size = " + cookies.size());
driver.close();
return cookies;
}
}
首先需要在这个网站注册一个账号。
在代码相应处填写你的账号和密码。
首先调用一个方法,获取cookie。
然后再利用cookie进行登录
在利用cookie的时候要注意这个错误,解决方法已经写在代码里了。
Exception in thread "main" org.openqa.selenium.InvalidCookieDomainException: You may only set cookies for the current domain
当然你直接在登录好的页面进行操作也可以。
之后就是你该干嘛干嘛。
缺点是效率很低下。