python利用selenium+phantomJS爬淘寶

weixin_34391445發表於2018-06-02

作者:黎智煊 叩丁狼高階講師。原創文章,轉載請註明出處。

環境準備:(本次準備環境都是基於window,其他系統都是類似的)


  1. 準備python基本版本(記得對應好自己的系統版本,32和64系統的區分)

  2. anacoda環境(自動包含jupyter notebook,一個利用瀏覽器和python進行互動的環境)

  3. 一個小小的注意地方

    • 就是安裝anconda的時候,到第三步的時候,(就是點選 I agree協議的下一步),選擇"All Users",意思是全域性安裝,可以減少不少的煩惱.
    • 然後下一步的advance option,把add path也勾選.
  4. 下載phantomJS https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-windows.zip.

  5. 然後解壓好上面的軟體到的資料夾,然後在這個資料夾按shift+右鍵,然後選擇"在此處開啟cmd/powershell視窗",然後你輸入jupyter notebook,然後一個基於web互動的python環境在開啟在你面前了,驚不驚喜?意不意外?

  6. 如下圖所示,你只需要點選右手邊的new,選擇python3就可以開啟第一個python互動了.(然後具體的jupyter notebook用法就不詳說了,可以自行百度)


    4151356-9629f94c6c5d56f4.png
    image.png
  7. 首先來一個小需求,就是去淘寶的特定商品,比如我這個"hdmi轉dp"


    4151356-cf7d33bfdf5d4ebb.png
    image.png
    • 然後你會發現,用python日常使用的爬蟲工具requests+lxml的etree,是無法正常獲取到價格等資料的,為什麼?因為大多數的電商平臺都是使用ajax,就是在真實的瀏覽器端不斷的重新整理獲取資料,可能是同時獲取到json資料,然後利用js指令碼填資料,又或者是直接在頁面來重新整理等待資料,反正就是有一定反爬的措施.所以,就需要使用模擬瀏覽器的方式去獲取資料了.使用phantomJS,這是一個虛擬的瀏覽器,但是都具備大部分的瀏覽器功能的.然後pyhton使用selenium語法去操作phantomJS就可以了.

python使用selenium呼叫phantomJS.


  1. 解壓好檔案並且重新命名好.


    4151356-d31dc545ead146e9.png
    image.png
  2. 然後就新建一個python互動,填寫這些程式碼,第一步都是匯入selenium和例項化phantomJS:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
##例項化一個phantomJS
##注意匯入的phantomJS路徑,記得是放在一開始說好的位置
driver = webdriver.PhantomJS(executable_path="phantomjs/bin/phantomjs.exe")

如果出現No module named 'selenium',你直接開啟任意一個cmd視窗就可以,輸入pip install selenium就可以了.
如果彈出一個"window防火牆安全警告",把兩個選項都打鉤就可以了.!

  1. 然後繼續寫一下程式碼:
#然後填入剛剛的淘寶url
driver.get("https://s.taobao.com/search?q=dp%E8%BD%AChdmi&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306")
##然後設定一下模擬瀏覽器的長寬.我這裡假設螢幕是1920*1080的螢幕.!
driver.set_window_size(width=1920,height=1080)

##然後按常理等待2秒鐘左右.
time.sleep(2)

##然後,我們現在嘗試一下利用剛剛的模擬瀏覽器去截圖匯出看看結果.
driver.save_screenshot("taobao.png")

然後你去剛剛的檔案看看是不是有一張圖片顯示出來,對的,就是如下圖所示,價格出來了有沒有.但是有個問題就是,感覺除了上部分能載入完,其餘部分是空白的.


4151356-f67a28728bb08884.png
image.png

所以進行第四步,模擬滾動.

  1. 模擬滾動,程式碼如下,我寫成函式來呼叫了,方便呼叫,還有,一下為完整的程式碼:
#匯入selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.PhantomJS(executable_path="phantomjs/bin/phantomjs.exe")
#然後填入剛剛的淘寶url
driver.get("https://s.taobao.com/search?q=dp%E8%BD%AChdmi&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306")
##然後設定一下模擬瀏覽器的長寬.我這裡假設螢幕是1920*1080的螢幕.!
driver.set_window_size(width=1920,height=1080)

##然後按常理等待2秒鐘左右.
#time.sleep(2)

##模擬滾動
def rollView():
    global driver
    height = 1080
    for x in range(12):
        jsSQL = "document.body.scrollTop="+str(height)
        driver.execute_script(jsSQL)
        print(height)
        height += 1080
        time.sleep(2)

rollView()

##然後,我們現在嘗試一下利用剛剛的模擬瀏覽器去截圖匯出看看結果.
driver.save_screenshot("taobao.png")

然後就能看到完整的整個頁面了!


4151356-d212e5ab66722cea.png
image.png
  1. 最後的最後,圖片只是用來看的,所以,我們需要把載入好完整頁面的資料再繼續用於分類就可以了.按照上圖,資訊是儲存在這個例項的page_source變數當中,我們可以列印一下,print(driver.page_source),所以,剩下的,你就可以為所欲為.


    4151356-5e8eb1975b750f2d.png
    image.png

    4151356-bf79f55955bfb480.png
    image.png
807144-8a5c0fd7392409b9.jpeg
WechatIMG7.jpeg

相關文章