1. 程式人生 > >使用selenium爬蟲抓取資料

使用selenium爬蟲抓取資料

寫在前面

本來這篇文章該幾個月前寫的,後來忙著忙著就給忘記了。
ps:事多有時候反倒會耽誤事。
幾個月前,記得群裡一朋友說想用selenium去爬資料,關於爬資料,一般是模擬訪問某些固定網站,將自己關注的資訊進行爬取,然後再將爬出的資料進行處理。
他的需求是將文章直接匯入到富文字編輯器去釋出,其實這也是爬蟲中的一種。
其實這也並不難,就是UI自動化的過程,下面讓我們開始吧。

準備工具/原料

1、java語言
2、IDEA開發工具
3、jdk1.8
4、selenium-server-standalone(3.0以上版本)

步驟

1、分解需求:

  • 需求重點主要是要保證原文格式樣式都保留:
  • 將要爬取文章,全選並複製
  • 將複製後的文字,貼上到富文字編輯器中即可

2、程式碼實現思路:

  • 鍵盤事件模擬CTRL+A全選
  • 鍵盤事件模擬CTRL+C複製
  • 鍵盤事件模擬CTRL+V貼上

3、例項程式碼

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.concurrent.TimeUnit;

/**
 * @author rongrong
 * Selenium模擬訪問網站爬蟲操作程式碼示例
 */
public class Demo {
    private static WebDriver driver;
    static final int MAX_TIMEOUT_IN_SECONDS = 5;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        driver = new ChromeDriver();
        String url = "https://temai.snssdk.com/article/feed/index?id=6675245569071383053&subscribe=5501679303&source_type=28&content_type=1&create_user_id=34013&adid=__AID__&tt_group_id=6675245569071383053";
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(MAX_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
        driver.get(url);
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        if (driver != null) {
            System.out.println("執行結束!");
            driver.quit();
        }
    }

    @Test
    public void test() throws InterruptedException {
        Robot robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e1) {
            e1.printStackTrace();
        }
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_A);
        robot.keyRelease(KeyEvent.VK_A);
        Thread.sleep(2000);
        robot.keyPress(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_C);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        driver.get("https://ueditor.baidu.com/website/onlinedemo.html");
        Thread.sleep(2000);
        driver.switchTo().frame(0);
        driver.findElement(By.tagName("body")).click();
        robot.keyPress(KeyEvent.VK_CONTROL);
        robot.keyPress(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_V);
        robot.keyRelease(KeyEvent.VK_CONTROL);
        Thread.sleep(2000);
    }


}

寫在後面

筆者並不是特別建議使用selenium做爬蟲,原因如下:

  • 速度慢:

每次執行爬蟲都要開啟一個瀏覽器,初始化還需要載入圖片、JS渲染等等一大堆東西;

  • 佔用資源太多:

有人說,把換成無頭瀏覽器,原理都是一樣的,都是開啟瀏覽器,而且很多網站會驗證引數,如果對方看到你惡意請求訪問,會辦了你的請求,然後你又要考慮更換請求頭的事情,事情複雜程度不知道多了多少,還得去改程式碼,麻煩死了。

  • 對網路的要求會更高:

載入了很多可能對您沒有價值的補充檔案(如css,js和影象檔案)。 與真正需要的資源(使用單獨的HTTP請求)相比,這可能會產生更多的流