1. 程式人生 > 實用技巧 >Python Selenium 實戰教學:爬取每日天氣

Python Selenium 實戰教學:爬取每日天氣

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

作者:氣象學渣

一、準備工作

1、Selenium的介紹與安裝

Selenium是一個Web的自動化(測試)工具,它可以根據我們的指令,讓瀏覽器執行自動載入頁面,獲取需要的資料等操作。

爬蟲,就是一段自動抓取網際網路資訊的程式,從網際網路上抓取對於我們有價值的資訊,就好像一隻蟲子在一幢樓裡不知疲倦地爬來爬去。

傳統的爬蟲通過直接模擬 HTTP 請求來爬取站點資訊,由於這種方式和瀏覽器訪問差異比較明顯,很多站點都採取了一些反爬的手段。 Selenium 是通過模擬瀏覽器來爬取資訊,其行為和使用者幾乎一樣,而且不用去分析每個請求的具體引數,比起傳統的爬蟲學起來更容易。唯一缺點是速度較慢,如果對爬蟲的速度沒有要求,那使用 Selenium 是個非常不錯的選擇。

Selenium的安裝相當簡單,直接pip install selenium線上安裝就行了。

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

2. chromedriver的下載與安裝

Selenium 自身並不具備瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。Google的Chrome瀏覽器能很方便的支援此項功能,只需安裝其驅動程式Chromedriver就可以了。

下載地址:http://chromedriver.storage.googleapis.com/index.html

如何檢視瀏覽器版本?可以在位址列輸入‘chrome://version/’,第一行就是版本資訊。以小渣自己的瀏覽器為例,版本為76.0.3809.132(32位)。(補充,也可以在軟體通常都有的“關於”資訊中找到)

接著,下載對應版本的chromedriver(若無,則下載版本號最接近的即可)。小渣這裡下載的是76.0.38.09.126。

解壓下載檔案,得到chromedriver.exe。作為一個新手教程,小渣不建議去設定什麼複雜的環境變數,後續在使用chromedriver時用加絕對路徑引用就行。

二、Python+Selenium爬蟲

完成準備工作之後就可以進行爬蟲了。首先我們使用Selenium的瀏覽器驅動介面工具webdriver開啟我們的爬取目標:中央氣象臺網站上的每日天氣圖。

程式碼:

from selenium import webdriver  ## 匯入selenium的瀏覽器驅動介面
chrome_driver = 路徑+'chromedriver.exe' #chromedriver的檔案位置 driver = webdriver.Chrome(executable_path = chrome_driver) #載入瀏覽器驅動 driver.get('http://www.nmc.cn/publish/observations/china/dm/weatherchart-h000.htm') #開啟頁面

1、Selenium頁面元素定位

假設我們想下載500hPa高度的基本天氣分析圖,在平時我們會怎麼做?肯定是在頁面上點選500hPa,選擇基本天氣分析,然後對圖片右鍵另存為對不對?那麼接下來我們就要藉助Selenium對網頁進行控制,爬取的過程也就是模擬上述一系列人為操作讓機器來自動執行。

Selenium對網頁的控制是基於各種HTML結構元素的,在使用過程中,對於網頁各類元素的定位是基礎,只有準確抓取到對應元素才能進行後續的自動化控制。

1.1 檢視頁面元素

Selenium定位時會涉及到一點HTML基礎知識,但不懂也沒關係,我們有偷懶的辦法。利用chrome瀏覽器的開發者工具,在chrome瀏覽器中右鍵點選-->檢查,我們可以輕鬆地檢視應的頁面元素。

舉個例子:我們移動滑鼠到層次500hPa,就可以自動定位到500hPa層級按鈕對應的HTML元素了,檢視到它的屬性,可以看到500hPa這個按鈕對應的頁面元素是link文字。

1.2 元素定位

元素檢視完畢後,接著就要進行元素定位,顧名思義就是要找到這個元素在網頁中的位置,這樣後續才能進行精確的頁面控制。Selenium提供了很多種定位元素的方法,本文用到的主要有2個:

id定位:find_element_by_id()

link定位:find_element_by_link_text()

button1=driver.find_element_by_link_text('500hPa')     #通過link文字精確定位元素
button2=driver.find_element_by_id('plist')             #通過id精確定位元素
elem_pic = driver.find_element_by_id('imgpath')        #通過id精確定位元素

2、ActionChains模擬滑鼠操作

元素定位完成後,還需要模擬滑鼠進行懸浮和單擊等操作來選擇和下載我們所需目標圖片。Selenium給我們提供了一個類來處理這類事件——ActionChains。這裡用到的2個操作是:

滑鼠懸浮操作:move_to_element ()

單擊滑鼠左鍵:click()

下面給出完整的實現指令碼:

from selenium import webdriver  ## 匯入selenium的瀏覽器驅動介面
from selenium.webdriver.common.action_chains import ActionChains
import time
import os

chrome_driver = 路徑+'chromedriver.exe'  #chromedriver的檔案位置
driver = webdriver.Chrome(executable_path = chrome_driver)          #載入瀏覽器驅動
driver.get('http://www.nmc.cn/publish/observations/china/dm/weatherchart-h000.htm')  #開啟頁面
# driver.maximize_window()
time.sleep(1)
#模擬滑鼠選擇高度層
button1=driver.find_element_by_link_text('500hPa')     #通過link文字精確定位元素
action = ActionChains(driver).move_to_element(button1) #滑鼠懸停在一個元素上
action.click(button1).perform()                        #滑鼠單擊
time.sleep(1)                                          #注意加等待時間,避免因速度太快而失敗
for p in range(1,3):    #下載昨日08點和20點的天氣圖
    str_p=str(p)
    #模擬滑鼠選擇時間
    button2=driver.find_element_by_id('plist')             #通過id精確定位元素
    action = ActionChains(driver).move_to_element(button2) #滑鼠懸停在一個元素上
    action.click(button2).perform()                        #滑鼠單擊
    time.sleep(1)
    Select(button2).select_by_index(str_p)                 #下拉選單通過文字值定位從0開始
    time.sleep(1)
    #模擬滑鼠選擇圖片
    elem_pic = driver.find_element_by_id('imgpath')       #通過id精確定位元素
    action = ActionChains(driver).move_to_element(elem_pic)
    action.context_click(elem_pic).perform()              #滑鼠右擊
    filename= str(elem_pic.get_attribute('src')).split('/')[-1].split('?')[0]  #獲取檔名
    print(filename)
    time.sleep(1)