以任意關鍵詞爬取商品數據
比如這裏以輸入中文爲例:小米手機(需要掃碼登錄)
爬蟲邏輯:【登陸】-【訪問頁面 + 採集商品信息 - 翻頁】
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)
#後兩行是把獲得的數據直接存放在本地
輸出的結果