webmagic是個神奇的爬蟲【三】—— 使用selenium模擬登陸
selenium本身是一種自動化測試工具,可以模擬瀏覽器進行頁面的載入,好處在於能通過程式,自動的完成例如頁面登入、AJAX內容獲取的的操作。
尤其是獲取AJAX生成的動態資訊方面,一般爬蟲只會獲取當前頁面的靜態資訊,不會載入動態生成的內容,但是selenium則完美的幫我們實現了這一功能。
但同樣他也有一些不好的地方,就是使用selenium功能的時候,需要事先載入selenium的驅動,在通過selenium本身加載出頁面動態生成的內容,以供之後爬取。
但是這節我們只講selenium的一個基本操作:頁面登入
後續我們還會講如何通過selenium進行動態頁面的爬取
================================================ 我是萌萌噠分割線 ======================================================
開始擼程式碼:
首先,我們先通過maven,配置好selenium的相關依賴
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.3.1</version> </dependency>
上面是selenium的 相關配置,當然,webmagic本身也對selenium有所整合,相關配置如下:
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-selenium</artifactId> <version>${webmagic.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
webmagic的這個配置對selenium有個一套簡單的封裝,具體使用哪種依賴各位看喜好就可以
使用selenium對頁面盡進行爬取時,首先需要下載相關的瀏覽器驅動,不同版本的瀏覽器對應的驅動也不一樣
我用的是chrome的驅動,所以也提供一下chromedriver的下載地址,其餘如火狐、ie的驅動百度一下都可以輕鬆找到
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
爬取之前,需要以上兩句載入瀏覽器驅動和爬取的目標網址
以為我已經把驅動放在chrome路徑下的bin資料夾中,並且在環境變數path中也把chromedriver的地址加進去,所以我在new ChromeDriver的時候沒有帶引數
如果不想把驅動配到環境變數中也可以直接吧驅動的路徑寫成引數傳進去就可以(
例:
new ChromeDriver("D://chromedriver.exe")
)
public class MeipaiProccessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(3000)
.setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36");
@Override
public void process(Page page) {
WebDriver driver = new ChromeDriver();
driver.get("http://www.meipai.com/");
//防止頁面未能及時加載出來而設定一段時間延遲
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//找到登入按鈕,點選
driver.findElement(By.id("headerLogin")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.id("dialogLWrap")).findElement(By.id("dialogLPlatform")).findElement(By.tagName("a")).click();
driver.findElement(By.id("userId")).sendKeys("賬號");
driver.findElement(By.id("passwd")).sendKeys("密碼");
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.xpath("//p[@class='oauth_formbtn']/a[@node-type='submit']")).click();
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
List<SpiderListener> spiderListeners = new ArrayList<>();
SpiderListener spiderListener = new SpiderListener() {
@Override
public void onSuccess(Request request) {
System.out.println("sucsess");
}
@Override
public void onError(Request request) {
}
};
spiderListeners.add(spiderListener);
Spider.create(new MeipaiProccessor())
.setSpiderListeners(spiderListeners)
.addUrl("http://www.meipai.com/")
.thread(5)
.start();
}
以上是對美拍進行模擬登陸的程式碼,之前配置過一些基礎的BasePageProcess類,把site和一些基礎的邏輯功能放在裡面,然後讓爬蟲程式只需要完成頁面解析的功能,但是當時忘記把BasePageProcess類的程式碼貼上去,到時有人反映程式跑不起來,所以這次一切從簡,實現webmagic最基本的PageProcessor介面,所有的邏輯都在以上程式中體現出來。
程式碼功能比較單一,主要就是通過findElement方法定位到賬號密碼的輸入框,把對應的賬號密碼輸入進去,最後點選登入完成整個模擬登陸的操作。
selenium本身沒有什麼難理解的東西,而且還能幫助我們更好的完善爬蟲的功能。用好它,爬蟲的水平必將更上層樓!