1. 程式人生 > >python +selenium 爬取淘寶網商品資訊

python +selenium 爬取淘寶網商品資訊

      前幾天用python爬取豆瓣關於電影《長城》的影評,發現豆瓣的網頁是靜態的,心中一陣竊喜。以為對於動態網頁瞭解的不是太多。但是主要是用cookie加headers爬取的。效果還不錯,爬取了六七萬條網友的評價,後期主要打算研究一下,如何發現那些使用者是水軍。今天研究了動態網頁的爬取,主要是爬取的淘寶網上商品資訊。主要是用到了selenium庫。

主要是實現一下幾個步驟:

 (註釋)用到的python庫:

import re
import time
import random 
from bs4 import BeautifulSoup
from selenium import webdriver

(1)通過selenium模擬登陸瀏覽器(我用的是Firefox,其他的瀏覽器原理也類似。)

       構造火狐模擬瀏覽器

           firefox_login=webdriver.Firefox() (電腦上如果有火狐的話,或開啟一個空白的瀏覽器網頁)

       登陸淘寶賬戶(使用者名稱,密碼)  (註釋,必須切換到賬戶密碼登陸下才能這樣登陸,萬惡的淘寶,現在的登陸頁面是先跳轉到掃二維碼的登陸方式,所以必須要手動切換回來回事通過selenium 模擬切換回密碼登陸狀態才行),如果有大神可以告訴我一下如何通過二維碼登陸哈,萬分感激。

      firefox_login.find_element_by_id('TPL_username_1').clear()
      firefox_login.find_element_by_id('TPL_username_1').send_keys(u'使用者名稱')
      firefox_login.find_element_by_id('TPL_password_1').clear()
      firefox_login.find_element_by_id('TPL_password_1').send_keys(u'密碼')
       

        點選登陸 按鈕實現登陸         

      firefox_login.find_element_by_id('J_SubmitStatic').click()
       OK,現在瀏覽器已經登陸到自己的淘寶賬戶了。下一步就是搜尋你想要的東西了。

  (2)搜尋相應的資訊(在這裡我搜了“”程式碼之美”的書的相關資訊)  

    firefox_login.find_element_by_id('q').send_keys(u'程式碼之美')
    firefox_login.find_element_by_class_name('btn-search').click()
    此時你的火狐瀏覽器中的頁面就會跳轉到“程式碼之美”網頁,此網頁中就包換了淘寶網上關於《程式碼之美》的資訊了(包括商家、書名‘、簡介、價格、店鋪所在地、已付款人數等’’)

   (3)獲取迴圈翻頁的頁數。(為迴圈做準備)

         首先,獲取瀏覽器下的靜態頁面   

        html=firefox_login.page_source
         這時候BeautifulSoup 庫就可以發揮它的強大了
           
      soup = BeautifulSoup(html,'lxml') 
      comments=soup.find_all("div", class_="total")  #匹配總的頁數
      pattern=re.compile(r'[0-9]')
      pageNum=pattern.findall(comments[0].text)     # 將數字頁數提取
      pageNum=int(pageNum[0])
        必須注意的一點就是獲得的PageNum必須轉換成int型。

   (3)對html進行解析

    Infolist=[]    #儲存爬去的資訊
    comments=soup.find_all("div", class_="ctx-box J_MouseEneterLeave J_IconMoreNew")
    for i in  comments:
        temp=[]
        Item=i.find_all("div",class_="row row-2 title")  #圖書相關資訊
        temp.append(Item[0].text.strip())
        shop=i.find_all("div",class_="row row-3 g-clearfix")
        for j in shop:
            a=j.find_all("span")
            temp.append(a[-1].text)    #店鋪名稱
        address=i.find_all('div',class_='location') 
        temp.append(address[0].text.strip())   #店鋪所在地
        priceandnum=i.find_all("div",class_="row row-1 g-clearfix")
        for m in priceandnum:
            Y=m.find_all('div',class_='price g_price g_price-highlight')
            temp.append(Y[0].text.strip()) #商品價格
            Num=m.find_all('div',class_='deal-cnt')
            temp.append(Num[0].text.strip())   #購買人數
        Infolist.append(temp)
      以上爬蟲程式碼必須結合著網頁原始碼才能比較好的理解。

      (4) 爬完一頁就需要點選重新整理資料進行下一次爬去((淘寶頁面用的是ajax(意味著不必重新載入真個頁面的情況下,對區域性資料進行更新,所以網頁地址不會改變))
 firefox_login.find_element_by_xpath('//a[@trace="srp_bottom_pagedown"]').click()  #點選下一頁ajax重新整理資料
      以上幾個部分基本上就是淘寶網的物品資訊必備的幾個步驟了。本人也是初步學習爬蟲。難免有錯誤和瑕疵,請大神批評指正。下面是完整的程式。比較簡單,後期會加上多執行緒以及其他相應的相應的情況處理(比如多次登入後,再次登入,淘寶會通過滑動的驗證碼進行驗證,這個可以做一下)。寫一下這個也是為了防止自己以後忘記,雖然對於大神來說有些簡單,但是,剛開始學習,就是從基礎做起。 Fighting,加油!
完整程式碼如下:
from selenium import webdriver 
from bs4 import BeautifulSoup
import random
import re
import time
Infolist=[]

def init():   
    firefox_login=webdriver.Firefox()   #構造模擬瀏覽器
    firefox_login.get('https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F') #淘寶登入頁面
    firefox_login.maximize_window()#視窗最大化,可有可無,看情況
    return firefox_login
    
def login(firefox_login):    
    #輸入賬戶密碼
    #我請求的頁面的賬戶輸入框的'id'是username和密碼輸入框的'name'是password
    firefox_login.find_element_by_id('TPL_username_1').clear()
    firefox_login.find_element_by_id('TPL_username_1').send_keys(u'使用者名稱')
    firefox_login.find_element_by_id('TPL_password_1').clear()
    firefox_login.find_element_by_id('TPL_password_1').send_keys(u'密碼')
    firefox_login.find_element_by_id('J_SubmitStatic').click()
    time.sleep(random.randint(2,5))
    firefox_login.find_element_by_id('q').send_keys(u'程式碼之美')
    firefox_login.find_element_by_class_name('btn-search').click()
    return firefox_login
def ObtainHtml(firefox_login):
    
    data=firefox_login.page_source
    soup = BeautifulSoup(data,'lxml') 
    comments=soup.find_all("div", class_="ctx-box J_MouseEneterLeave J_IconMoreNew")
    for i in  comments:
        temp=[]
        Item=i.find_all("div",class_="row row-2 title")  #圖書相關資訊
        temp.append(Item[0].text.strip())
        shop=i.find_all("div",class_="row row-3 g-clearfix")
        for j in shop:
            a=j.find_all("span")
            temp.append(a[-1].text)    #店鋪名稱
        address=i.find_all('div',class_='location') 
        temp.append(address[0].text.strip())   #店鋪所在地
        priceandnum=i.find_all("div",class_="row row-1 g-clearfix")
        for m in priceandnum:
            Y=m.find_all('div',class_='price g_price g_price-highlight')
            temp.append(Y[0].text.strip()) #商品價格
            Num=m.find_all('div',class_='deal-cnt')
            temp.append(Num[0].text.strip())   #購買人數
        Infolist.append(temp)
    
        
#   獲取迴圈爬蟲的頁碼數      
def getPageNum(firefox_login):
    data=firefox_login.page_source
    soup = BeautifulSoup(data,'lxml') 
    comments=soup.find_all("div", class_="total")  #匹配總的頁數
    pattern=re.compile(r'[0-9]')
    pageNum=pattern.findall(comments[0].text)     # 將數字頁數提取
    pageNum=int(pageNum[0])
    return pageNum     #用於迴圈的次數設定
   
   
# 點選下一頁 //更新資料。   
def NextPage(firefox_login):
    firefox_login.find_element_by_xpath('//a[@trace="srp_bottom_pagedown"]').click()  #點選下一頁ajax重新整理資料
         
if __name__=='__main__':
    firefox_login=init()  
    firefox_login=login(firefox_login)
    Num=getPageNum(firefox_login)
    for i in range(Num-1):
        ObtainHtml(firefox_login)
        NextPage(firefox_login)
    print("資訊爬取完成")