1. 程式人生 > >爬蟲那點事,幹就玩了之seleunim

爬蟲那點事,幹就玩了之seleunim

目錄

  • selenium
    • 環境準備
    • 程式碼環境
    • 開始爬蟲
      • 操作js
      • 截圖
      • 切換視窗
      • 在當前視窗切換訪問地址
      • 管理cookie
  • # 加入戰隊
    • 微信公眾號
  • # 加入戰隊
    • 微信公眾號

做技術我們最重要的是【做】。但是今天我們來講片【玩】。這句話可能不太好理解。直接開門見山吧。對於外行朋友一談到IT他們對我們的定位就是黑客。其實我們和黑客一點關係都沒有。今天的技術是【爬蟲】 。 為什麼說爬蟲和黑客有點關聯呢。因為爬蟲可以將人為行為進行機器化。就是實現編寫好程式碼讓機器代替我們人類重複的操作意見事情。

對於爬蟲了我們這裡不做基礎的講解了。在平時的開發中我們偶爾會用到爬蟲。比如說我們系統需要新增天氣情況。但是我們有沒有氣象站給我提供資料。這時候我們最顯示的做法就是呼叫網路上免費的天氣介面API 。 這個時候我們Java就會通過爬蟲模擬除一個瀏覽器請求去訪問這個天氣介面的API。 然後在通過爬蟲獲取這個API返回的資料。從而進行解析。

對於這些免費的API我們通過爬蟲(HttpClient)就可以輕鬆的訪問了。但是想優酷、愛奇藝、掘金這些等級網站他們會有發爬蟲策略。最常見的就是利用爬蟲進行刷票的行為。他們針對這些刷票做了一些措施。具體措施就不說了(不知道)。更有甚者他們對他們的頁面進行加密。讓你無法分析他們的html.或者加大你分析的成本。以上就是之前我們用爬蟲爬取資料遇到的一些問題。下面簡單梳理下我們遇到爬蟲的問題

  • 網路反爬蟲
  • 網路人為稽核
  • 登入驗證碼
  • 需要了解網站(需要有程式碼經驗進行html分析)

selenium

今天我們帶了一個好東西。它轉變了我們傳統爬蟲的思路。傳統的爬蟲我們會去按照開發者的思路去處理邏輯。但是selenium他不需要關注開發者邏輯。只需要我們關注自己的需求。什麼意思呢?就是說selenium他就是在模擬使用者的行為,你告訴selenium我需要點選頁面的某個按鈕了,他就去點選了。你告訴他我需要在某個輸入框中輸入內容了。他就去給你輸入內容。有了它,你再也不用管輸入內容之後提交登入真正請求了。這樣的好處是降低了爬蟲的學習成本。對於不懂技術的人也可以很快上手了。

環境準備

點我下載核心

這個是幹嘛的呢?這裡先透露下selenium使用的是瀏覽器的核心操作頁面的。所以這裡需要現在核心。下載核心前提是電腦上有瀏覽器。筆者這裡電腦上瀏覽器是Google 1.73版本 。 所以下載核心就得是對應的版本,否則會報錯的。在notes.txt檔案中會列出每個對應的瀏覽器的版本的。

程式碼環境


<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>3.141.59</version>
</dependency>

開始爬蟲

想想我們平時瀏覽網頁的時候是需要先開啟瀏覽器,這裡也是一樣。

【我們需要開啟瀏覽器】(我的核心放在/root/Downloads/chromedriver)


ChromeOptions chromeOptions = new ChromeOptions();
File chromeDriverPath = new File("/root/Downloads/chromedriver");
System.setProperty("webdriver.chrome.driver", chromeDriverPath.getAbsolutePath());
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--disable-gpu");
//ubuntu瀏覽器中需要新增
chromeOptions.addArguments("--no-sandbox");
webDriver = new ChromeDriver(chromeOptions);

headless : 表示隱式開啟瀏覽器,因為做爬蟲就不需要顯示介面了。
no-sandbox : 這個是因為我的Ubuntu安裝的google需要這個引數,所以這裡也需要加上
disable-gpu : 同上

【輸入連結地址】(https://juejin.im/)
webDriver.get("https://juejin.im/");,這樣核心就獲取到了我們在瀏覽器中看到的效果。那麼我們這麼獲取我們需要的頁面資料呢。
findElement通過這個方法我們可以獲取到我們想要的任何資料。換句話說通過這個方法這個頁面在你面前一覽無餘。包括他的衍生頁面
有的讀者有疑問了。我該怎麼讓他獲取我想要的東西呢。

我們可以看出來這個方法裡只有一個引數,By物件。這個By物件裡提供瞭如下方法

  • id
  • linkText
  • partialLinkText
  • name
  • tagName
  • xpath
  • className
  • cssSelector

上面這些方法就是我們定位元素的方法。什麼意思呢,我們前段朋友們經常通過jquery操作html的dom物件,在By物件裡cssSelector就是和jquery同樣的操作方法。好多都是和jquery類似的。這裡不懂技術的人會說這裡技術點很難。其實不難。 我們不懂程式碼的怎麼辦呢。我們在瀏覽器瀏覽頁面 。 比如下圖中我想獲取我的部落格名稱(框架原理那點事--不就反射嘛。)

我們滑鼠放在【框架原理那點事--不就反射嘛】上右鍵選擇【檢查】。會自動跳轉到對應的程式碼的


後面三種對應By裡面的制定方法。這裡就不說了。

操作js


WebElement webElement = webDriver.findElement(By.cssSelector("xxxxxx"));
JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("arguments[0].click();",digg);

上面的webElement是頁面中一個按鈕。我們可以直接webElement.click()讓按鈕點選或者webElement.submit()提交Form表單。但是有的時候會不起作用。這個時候用上面的程式碼可以進行點選。

截圖


File source = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
try {
    Files.copy(source.toPath(), new FileOutputStream(new File("/root/Downloads/test/1.png")));
} catch (IOException e) {
    e.printStackTrace();
}
try {
    TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
    e.printStackTrace();
}

我們核心操作因為正常不開瀏覽器介面,但是我們除錯的時候又想知道結果,可以列印除當前視窗的圖片。就是上述的程式碼

切換視窗


Set<String> windowHandles = webDriver.getWindowHandles();
for (String windowHandle : windowHandles) {
    if (!windowHandle.equals(webDriver.getWindowHandle())) {
        //webDriver.switchTo().window(windowHandle);
    }
}

在當前視窗切換訪問地址


webDriver.navigate().to("https://juejin.im/post/5d76f6585188254cc27b2af4");
webDriver.get("https://juejin.im/post/5d76f6585188254cc27b2af4");

管理cookie


webDriver.get("https://juejin.im/timeline");
webDriver.manage().addCookie(cookie);
webDriver.get("https://juejin.im/post/5d76f6585188254cc27b2af4");

這裡值得注意的是,在新增cookie之前我們需要先訪問主頁,告訴核心我們後面新增的cookie是給那個Host下新增的。這樣我們新增的cookie才會有效。如上我們在juejin.im這個Host下都添加了Cookie。

個人網站(https://zxhtom.oschina.io)

個人微信(zxh870775401)

微信公眾號 : 新華前後端開發

加入戰隊

# 加入戰隊

微信公眾號


加入戰隊

# 加入戰隊

微信公眾號

相關推薦

爬蟲seleunim

目錄 selenium 環境準備 程式碼環境 開始爬蟲 操作js 截圖 切換視窗 在當前視窗切換訪問地址 管理cookie

軟能力你知多少

愛好者 我們 了吧 一個 工作管理 創新 優勢 思維 經理 目錄 一、軟能力是什麽 二、軟能力-程序猿生存指南 A. 溝通能力 B. 學習能力 C. 時間管理 D. 分解能力 E. 總結改進 三、程序猿成長路線 1. 架構師 2. 項目經理 3. 產品經理 四、小結

關於 DataTables 本地儲存又愛又恨 (stateSave引數應用)

為什麼說又愛又恨?這要從很久很久以前說起…… 目錄 愛在哪裡? 說實在的stateSave 這個還是 DataTables 一個比較好的功能,儲存上次分頁狀態,資料上次排列順序,上次條件過濾的結果……, 這些對於某些開發者來說無疑是非常棒的,所以能不愛嗎?無法

【 專欄 】- 網路爬蟲

部落格公告 該部落格內容僅代表個人意見,方便作者日後查閱和學習之用。無私分享到網際網路,希望給有需要的朋友一點點幫助。但作者寫作等各方面的能力有限,若有寫得不妥的地方從而給各位朋友帶來麻煩那又怎麼樣,來揍我啊。 (a

Spring Mvc---(22)Spring Mvc攔截器WebRequestInterceptor

WebRequestInterceptor和HandlerInterceptor一樣,也有三個方法,preHandle,postHandle,afterCompletion,不同的是preHandle沒有返回值,而且WebRequestInterceptor的三個方法的引數

【Java那點事 | 學習●思考●分享 | Java技術交流QQ群:83753349】當你的才華還撐不起你的野心時,那應該靜下心來學習。豈能盡如人意但求無愧我心; 努力不一定會成功但是放棄一定會失敗; 好好學習天天向上不求與人相比但求超越

當你的才華還撐不起你的野心時,那你就應該靜下心來學習。豈能盡如人意,但求無愧我心; 努力不一定會成功,但是放棄一定會失敗; 好好學習,天天向上,不求與人相比,但求超越自己; 知其然,還要知其所以然;...

NMIFIQ 與arm構架-(1)

微信公眾號 mindshare思享   NMI是Non Maskable Interrupt的縮寫,它是一種不能mask的硬體中斷,主要用於當一些不能恢復的硬體錯誤發生時傳送訊號給CPU。 NMI通常是用在當一般的中斷被軟體(比如OS)mask的情況下需要響應一

NMI FIQ 與arm構架-(2)

微信公眾號 mindshare思享   以下內容會談到: 1.   NMI的使用場景。 2.   在arm上怎麼模擬NMI a.   通過GIC的中斷優先順序模擬 b

「數據治理」系列二:手握數據「戶口本」數據治理肯定穩!

物理 系列 數據對比 概念 決策者 等等 ges mode 架構 這篇文章主要從數據治理的基礎和核心之一:元數據 入手,從以下幾個角度展開具體講解: 元數據概念元數據的分布和采集元數據的一些實際應用場景. 1.元數據到底是個啥? 如果我說:元數據(Meta Data),就是

前端開發的-------------ie絕對是個神坑360瀏覽器的相容模式依然是個神坑

最近做公司的pc官網。發現ie上個有個bug 是個神坑,在其他的谷歌,火狐上都是可以的就是ie11不行,還是高版本的ie呢 我用的是input框的input事件,在頁面初始化載入介面,展示資料的時候,會走input中的input事件,奇葩了,在其他的主流瀏覽器上就不會出現,

32位64位和記憶體的

這兩天果殼上有些人問到了關於在32位系統下使用4G或以上記憶體的問題。對於“32位作業系統能否使用4G或以上的記憶體”這個問題,在網路上爭論也是很多。下面,我就我自己對作業系統記憶體分配的理解,談談我的觀點。          32位、64和“最大記憶體量”是怎麼回事   

換裝WIN10(windows)點兒換裝作業系統一文通轉安裝作業系統

本文主要介紹了九個方面的內容: 1.win10對電腦要求、2.原版映象怎麼下載(除了windows系列映象,還有office系列)、3.如何製作U盤系統盤、4如何給硬碟調整分割槽(邏輯分割槽或拓展分割槽無法給主分割槽容量怎麼辦?)windows下如何更改碟符?如何新建磁碟?

萬字雄文講透現代網路負載均衡和代理技術終於弄懂負載均衡

作者:Matt Klein譯者:崔秀龍原題:Introduction to modern network load balancing and proxying最近我注意到,針對負載均衡和代理這兩項現代網路技術,有教育意義的介紹性材料相當稀缺。這引起我的思考:為什麼會這樣?在

「數據治理」系列三:不忘初心方得始終數據質量管理要穩住!

規劃 分組 質量 管理 決策者 出發 遇到 例子 評估 文 | 樂天(原創)未經許可,不可轉載。 編輯 | 劉能 碳酸 本文約 3209 字,預計閱讀時間 9 分鐘 作者簡介:蔣珍波(樂天),6 年+ 大數據咨詢經驗,擅長為客戶提供科學合理的大數據解決方案。目前擔任數瀾科

框架原理--不反射嘛。

記得之前寫了一篇json轉實體的文章 記得之前寫了一篇json轉實體的文章,裡面就用到了java反射的文章,但是當時只是瞭解到反射這個知識點,並沒有深入的瞭解,寒假閒來無事覺頂深入整理一下java 反射的知識,一下都是個人學習反射的總結,不到之處,還望大神指點!!! 反射顧名思義就是和java編譯相反的過程

設計模式--策略模式

簡化 cas enter ext font 想要 fonts 對象創建 客戶 概念: 策略模式定義了一系列的算法,分別封裝起來,讓它們之間能夠相互替換。此模式讓算法的變化,不會影響到使用算法的客戶。策略,實質上指的是算法。 樣例

談談字符串

沒有 register 用戶 今後 過程 破解 插件 運行 tro 在od破解軟件過程中,大家對於字符串應該是再熟悉不過了,但是往往事情不盡如人意,總是搜索不到想要的字符串,這時往往有的人會被迫用別的方法,消息斷點,內存斷點,硬件斷點等等,今天咱們只談字符串,把我所掌握的查

浮點數的

bsp 用兩個 處理 有一個 奇葩 加減乘 而且 出了 判斷 浮點數是計算機中儲存實數的形式。我們時常需要用浮點數去處理帶小數點的運算。可你是否知道,浮點數還有這些操作: 正負無窮大 與整數不同,浮點數沒有溢出的概念。當浮點數的運算結果超過一定範圍時,它的值就會根據運算結

新手···男生

for take edit ger har ping minutes lazy sgu 1、alarm clock go off鬧鐘響了,sleep right through it睡過去了,time to get up該起床, 2、you name it你說的 3、sle

mongodb第二篇文章~關於集群認證的

所有 目的 create 介紹 副本 這就是我 port pwd root 集群認證簡介:上一篇咱們介紹了單實力的認證方式,正好我在搞lepus監控,副本集合需要用戶認證 一 驗證方式: 1 auth 方式啟動=》單點 2 keyFile 方式啟動=》集群 請註意 開