使用selenium爬蟲抓取數據

寫在前面

原本這篇文章該幾個月前寫的,後來忙着忙着就給忘記了。
ps:事多有時候反倒會耽誤事。
幾個月前,記得羣裏一朋友說想用selenium去爬數據,關於爬數據,通常是模擬訪問某些固定網站,將本身關注的信息進行爬取,而後再將爬出的數據進行處理。
他的需求是將文章直接導入到富文本編輯器去發佈,其實這也是爬蟲中的一種。
其實這也並不難,就是UI自動化的過程,下面讓咱們開始吧。css

準備工具/原料

一、java語言
二、IDEA開發工具
三、jdk1.8
四、selenium-server-standalone(3.0以上版本)html

步驟

一、分解需求:

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

二、代碼實現思路:

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

三、實例代碼

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作爬蟲,緣由以下:java

  • 速度慢:

每次運行爬蟲都要打開一個瀏覽器,初始化還須要加載圖片、JS渲染等等一大堆東西;web

  • 佔用資源太多:

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

  • 對網絡的要求會更高:

加載了不少可能對您沒有價值的補充文件(如css,js和圖像文件)。 與真正須要的資源(使用單獨的HTTP請求)相比,這可能會產生更多的流量。瀏覽器

相關文章
相關標籤/搜索