Python 爬蟲教學 -試著作自己的搶購機器吧!(中)

這中篇隔的有點久哈哈,但上一篇python的爬蟲原理還受到蠻多喜愛的,所以這一篇我們就繼續來看看Python的教學吧!今天就要教大家實際製作專屬自己的爬蟲搶購機器!

前置作業

首先在上次安裝為Jupyter或Python相關程式後,我們這次要用的函式庫是Selenium,並且還需要下載Chromedriver,也就是需要下載chrome的驅動器,跟一般下載的chrome不一樣,這算是小型版的chrome,常常會在爬蟲使用,以下是下載連結,記得找到符合自己電腦的版本下載喔!

https://chromedriver.chromium.org

下載之後記得放在自己找得到的路徑,之後我們就可以開始寫程式了!

程式實作

首先我們要有一個概念,爬蟲基本上和我們手動操作網頁做的事情基本上差不多,只是將這件事自動化以及加上電腦的速度讓整體看起來很神奇而已,所以我們也會需要讓程式抵達我們要的網頁,瀏覽我們要瀏覽的元素這些步驟,那現在就先從抵達網頁開始吧!

from selenium import webdriver #利用selenium做爬蟲
driver_path = 'C:\Program Files\chromedriver.exe'  #導入chrome driver才能開模擬器
browser = webdriver.Chrome(driver_path)
browser.get("https://tw.buy.yahoo.com/gdsale/Nintendo-%E4%BB%BB%E5%A4%A9%E5%A0%82-%E5%8E%9F%E5%BB%A0Switch-Pro%E6%8E%A7%E5%88%B6%E5%99%A8-Joy-Con-Pro%E9%9B%99%E7%94%A8%E6%8E%A7%E5%88%B6%E5%99%A8%E5%85%85%E9%9B%BB%E5%BA%A7-%E8%B4%88-9244628.html") #此為switch產品網頁

首先driver_path代表的是你的chrome driver位置,而browser則是將位置驅動後代表你的網頁行動的變數,之後的動作都可以透過browser來執行,所以第四行的get(’網址’),就會是將網頁導入你要的頁面的意思,以上程式碼執行之後,應該會發現桌面開啟了另一個chrome,並且到了你指定的網址,那再來就會是第二步

輸入帳號密碼並完成登入

既然我們是要製造搶購機器,那我們就必須要能夠登入,才能夠進行搶購對吧?所以接下來就要交各位怎麼操作爬蟲的網頁去輸入帳號密碼,我們先看程式碼!

browser.find_element_by_link_text("登入").click()
search_Id = browser.find_element_by_name('username') #找到輸入帳號的位置 並先記錄之後要input
search_Id.send_keys('iamaccount') #輸入帳號   (到時候可以考慮利用腳步輸入多個帳號

browser.find_element_by_id('login-signin').click()
WebDriverWait(browser, 20, 0.5).until(EC.presence_of_element_located((By.ID, 'login-passwd'))) #顯性等待 不然爬蟲跑太快了 抓不到元素

search_password = browser.find_element_by_id('login-passwd') 
search_password.send_keys('wearelose') #輸入密碼
browser.find_element_by_id('login-signin').click()

讓我們一行一行來看,首先要理解這些程式碼,我們必須要用到上一次提到的內容,如果忘記了,趕快去複習!

點進去剛剛在程式碼裡的範例網頁我們能看到以下的畫面

還記得上一次的內容嗎,右鍵點擊網頁的任意處,然後會看到檢查的選項(記得使用chrome),點擊檢查,就可以看到我們上一次教學內容裡的網頁檢查資訊,我們接下來呢就需要使用這些資訊,來找到在爬蟲的世界裡,我們所點擊的按鈕背後的意義,所以首先會是登入的按鈕,大家點進去應該可以看到,資訊的頁面是相當混亂的,根本很難找到特定的資訊,所以呢我們要在善用一次剛剛的檢查的按鈕,將滑鼠放到登入的按鈕上,點擊右鍵,並且再次點擊檢查,我們就可以發現!

他自動的滑動到登入的位置了,可以看到登入兩個字寫在上面,其他元素也可以用類似的方式來找到喔,只是要特別注意有些元素不會直接寫著名字,這個時候怎麼確認你找到的元素是你想要的呢?這個時候我們只要將鼠標滑動在右側那一串的程式碼特定的位置之後觀察網頁!

可以看到在我將鼠標放在登入上的時候,左側的登入按鈕同時浮現了一串文字,這是在告訴你這個元素的id,
就好像身分證一樣,這樣就可以去確認你是不是有找到自己想要的元素了喔!

說了這麼多我們開始來看程式碼吧,瞭解了這些之後呢可以看到我們第一行的程式碼find_element_by_link_text,這是其中一種尋找方式,直接翻譯的話就會是 “找到元素透過link_text“,這個用法是在看到網頁元素有文字敘述的時候可以使用,像是上圖右側網頁元素裡可以明顯地看到登入兩個字,這個時候就可以透過這個方式來直接找到這個元素,並且接下來的.click(),就是點擊的意思,也就是操作網頁點擊這個元素,那之後就會進入到登入的頁面了!

所以有了上面的講解,接下來的操作應該就很直觀了,我們透過find_element_by_name,看上圖的右上角的話,可以找到name,這也是其中一種尋找方式,還有非常多種之後會慢慢介紹,至於哪種情況要使用哪種,最重要的會是唯一性,也就是最好你用來找該元素的屬性內容就只有該屬性擁有,通常id和class比較容易會是獨一無二的,找到name之後呢我們透過send_keys(‘帳號’)做像是打字的動作,就完成了自動輸入,之後一樣找到下一頁的按鈕進行點擊,而接下來呢則是要講解一行大家看了可能會比較疑惑的程式碼

Webdrvierwait是一個讓程式碼等一下的方法,因為我們透過爬蟲操作的速度太快,有時候甚至會快過我們讀取網頁內容的速度,這樣就會導致什麼呢? 導致我們在搜尋網頁元素的時候,根本就還沒將網頁讀取進來就進行搜尋了,那自然會讓程式出錯,所以這個方法的內容則是

WebDriverWait(browser(驅動器), 20(最多等待20秒), 0.5(每0.5秒搜尋一次))

.until((EC.presence_of_element_located((By.ID(搜尋方式), ‘login-passwd’(搜尋名稱))))

這樣就能夠確保我們不會讓程式碼跑在網頁讀取前面了,而接下來輸入密碼的三行程式碼就也是大同小異了,今天我們就先將自動化登入講完!其實講到這裡,聰明的同學應該能舉一反三完成整個程式了,但我發現能講的東西還蠻多的,不要一次讓大家吸收太多東西,就講到這裡,期待下一篇講解如何購買,以及如何在指定時間做搶購吧!

13 thoughts on “Python 爬蟲教學 -試著作自己的搶購機器吧!(中)”

    1. 感謝你的回覆!我沒有使用request寫過欸,但我認為從原理上來講是差不多的,只是需要去研究函式庫裡面有沒有類似可代替的功能

  1. 請問一下如果我執行到WebDriverWait(browser, 20, 0.5).until(EC.presence_of_element_located((By.ID, ‘login-passwd’)))會錯誤怎麼辦

      1. 我也有遇到這個問題 我的錯誤長這樣selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”css selector”,”selector”:”[id=”login-passwd”]”}

        1. hardco2020@gmail.com

          你可以試著用顯性等待,也就是文章中用到的webdriverwait,因為我在登入區塊沒有用是因為他一開始都抓得到,你可以先試著用,如果還報錯的話,再次貼你的報錯問題上來,謝謝留言~

    1. hardco2020@gmail.com

      你好,這代表可能該網頁無法讀取中文編碼(如果是用範例網頁的話可能有其他原因),建議你改使用find_element_by_name或者ind_element_by_id等等方法,我用text當範例只是有點偷懶的舉動哈哈哈實際並不建議這樣做,這邊丟一個selenium可以用來查找標籤屬性的位置給你參考,謝謝你的回覆!
      https://selenium-python.readthedocs.io/locating-elements.html

  2. 你好,我在需要登入帳號密碼的地方無法完成
    會出現以下錯誤 NoSuchElementException: no such element: Unable to locate element: {“method”:”css selector”,”selector”:”[name=”電話號碼/使用者名稱/Email”]”}
    我覺得可能是太快無法偵測到,使用webdriver則會出現
    AttributeError: type object ‘By’ has no attribute ‘name’
    請問是因為我搜尋方法不對嗎

  3. 你好,請問我一直搜尋不到關鍵字該怎麼解決
    錯誤為 NoSuchElementException: no such element: Unable to locate element: {“method”:”css selector”,”selector”:”[name=”密碼”]”}

    1. hardco2020@gmail.com

      這邊解決辦法和上一次的問題都是一樣的喔~需要多試幾個搜尋方法。
      尤其你目前的搜尋方法是利用中文字,這時常會出現很多編碼的問題,是不建議使用的,抱歉之前沒看到你的這則回覆

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *