【python實現網絡爬蟲(10)】Selenium框架以任意關鍵詞爬取淘寶商品數據

以任意關鍵詞爬取商品數據

比如這裏以輸入中文爲例:小米手機(需要掃碼登錄)
在這裏插入圖片描述

爬蟲邏輯:【登陸】-【訪問頁面 + 採集商品信息 - 翻頁】

1)函數式編程

函數1:get_to_page(keyword) → 【登陸】
         keyword:關鍵字

函數2:get_data(page_num) → 【訪問頁面 + 採集數據信息 - 翻頁
         page_num:翻頁次數

2)採集字段
商品照片、價格、付款情況、標題、店家名稱、店鋪地等字段
在這裏插入圖片描述

前期準備和封裝第一個函數

import time
import pandas as pd
from selenium import webdriver

def get_to_page(keyword):
    browser = webdriver.Chrome()
    browser.get('https://s.taobao.com/search?q={}'.format(keyword))  
    time.sleep(15)
    #用於掃碼,可以把時間設置的長一些,畢竟是人工操作
    #嘗試過密碼輸入,無法通過滑塊驗證
    print("程序已經成功進入目標頁面")
    return browser

該部分代碼實現的就是:導入相關的庫,然後調用selenium框架進行登錄後,跳轉到指定關鍵詞的搜索頁面

封裝第二個函數

該部分就是商品信息的獲取以及錯誤異常處理和可視化輸出的問題

步驟一、獲取商品對應的標籤,這裏使用xpath路徑(最爲簡潔,直接複製粘貼就可以了)
比如獲取標題的信息,首先進入到檢查界面,找到標題對應的位置,然後右鍵copy,然後在選擇copy XPath,將複製的內容粘貼到下面的.browser.find_element_by_xpath的括號裏面即可
在這裏插入圖片描述
步驟二、創建個字典用以保存數據

dic = {}
dic['標題'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2]').text
print(dic)

輸出的結果爲:
在這裏插入圖片描述
可以正常輸出後,就可以把獲取的其他字存放到字典裏面了,其他字段的xpath路徑也是直接複製粘貼的

dic = {}
dic['img'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[1]/div/div[1]/a/img').get_attribute('src')
dic['標題'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2]').text
dic['店鋪'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[1]/a/span[2]').text
dic['店家地址'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[2]').text
dic['產品售價'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[1]/strong').text  
dic['付款情況'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[2]').text
print(dic)

輸出的結果爲:
在這裏插入圖片描述
檢查覈對,這是以“小米手機”爲關鍵次搜索的第一個商品,在網頁的信息如下,可以看出完全匹配
在這裏插入圖片描述
步驟三、xpath路徑解析,使用xpath路徑的好處在於每個商品的標籤都是按照順序擺放的,比如這裏的商品信息,都是分散在第四個【div】標籤下面,解析如下:

//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2] #第一個商品標題的路徑
//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[2]/div[2]/div[2] #第二個商品標題的路徑
//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[3]/div[2]/div[2] #第三個商品標題的路徑
......

分析可以得出,只要是修改第四個div[]裏面的內容就可以實現對應商品數據的獲取,而一頁的商品是48個,直接for i in range(1,49),就可以實現第一頁的商品信息的獲取了,爲了防止爬取過程中出錯,加上異常錯誤判斷的處理(比如有的商品上面就沒有地址,爲了保證程序正常運行下去,加上try-except進行處理)

for i in range(1,49):
     try:
         dic = {}
         dic['img'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[1]/div/div[1]/a/img').get_attribute('src')
         dic['標題'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[2]').text
         dic['店鋪'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[1]/a/span[2]').text
         dic['店家地址'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[2]').text
         dic['產品售價'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[1]/strong').text  
         dic['付款情況'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[2]').text
         print(dic)
     except:
         print("數據採集失敗")

運行的結果如下
在這裏插入圖片描述
步驟四、翻頁處理,就是get_datas函數裏面傳參的page_num,進行遍歷即可,這裏面要完成翻頁的功能,採用的是點擊下面的數字框,然後輸入要爬取的數字,接着點擊“確定”按鈕即可
在這裏插入圖片描述

for j in range(1,page_num+1):
	try:
		num = browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')
        num.clear()
        num.send_keys(j+1)
        browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()
        time.sleep(5)
        print("已爬取{}頁,程序休息.....{}s".format(j,5))
  except:
      continue

至此該過程的所有的步驟都已經操作完成,封裝第二個函數,爲了將爬取的數據之中存放在電腦上,需要將所有的字典都存放在列表裏,最後整個函數返回的是一個存放數據的列表。如下(兩個try-except一個是應對頁面的數據爬取的問題,還有一個應對的是翻頁的問題,最後爲了保證數據爬取到位,在每次翻頁之後要讓瀏覽器休息一下,設置一個暫停時間,一般5s足夠)

def get_datas(page_num):
    data_lst = []
    for j in range(1,page_num+1):
        try:
            for i in range(1,49):
                try:
                    dic = {}
                    dic['img'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[1]/div/div[1]/a/img').get_attribute('src')
                    dic['標題'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[2]').text
                    dic['店鋪'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[1]/a/span[2]').text
                    dic['店家地址'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[2]').text
                    dic['產品售價'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[1]/strong').text  
                    dic['付款情況'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[2]').text
                    print(dic)
                    data_lst.append(dic)
                except:
                    print("數據採集失敗")
            num = browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')
            num.clear()
            num.send_keys(j+1)
            browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()
            time.sleep(5)
            print("已爬取{}頁,程序休息.....{}s".format(j,5))
        except:
            continue
    print("一共獲取{}條數據".format(len(data_lst)))
    return(data_lst)

最後執行代碼

通過分塊執行,上邊是導入的庫和封裝的函數,下面直接就是調用函數和保存數據的過程即可

if __name__ == '__main__':
    
    browser = get_to_page('小米')
    data_lst = get_datas(3)
    #前兩行是直接完成爬取淘寶中3頁以小米手機爲關鍵詞搜索得到的商品信息數據
    data = pd.DataFrame(get_datas(3))
    data.to_excel('數據.xlsx',index=False)
    #後兩行是把獲得的數據直接存放在本地

輸出的結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章