完整程式碼&火狐瀏覽器驅動下載連結:https://pan.baidu.com/s/1pc8HnHNY8BvZLvNOdHwHBw 提取碼:4c08
雙十一剛過,想著某寶的資訊看起來有些少很難做出購買決定。於是就有了下面的設計:
既然有了想法那就趕緊說幹就幹趁著雙十二還沒到
一、準備工作:
安裝 :selenium 和 tkinter
pip install selenium
pip install tkinter
下載火狐瀏覽器驅動
二、網站分析
發現web端如果不登入就不能進行查詢商品
登入後查詢口紅
發現url竟然張這樣
https://s.taobao.com/search?q=口紅&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20211117&ie=utf8&bcoffset=1&ntoffset=1&p4ppushleft=2%2C48&s=44
通過觀察發現url中的q=**表示的是搜尋的內容 s=**表示頁數
接下來確定網頁中我們將要採集的資料
採集的資料有:商品價格;付款人數;商品標題;店鋪url;店家地址;
三、程式碼編寫
1、類庫引用
import json import pandas as pd from selenium import webdriver import time from tkinter import * import tkinter.messagebox
2、視窗化程式碼實現
# 設定視窗 window = Tk() window.title('qcc_nw0.1') # 設定視窗大小 window.geometry('500x200') # lable標籤 l = Label(window, text='如何真正逛淘寶!!', bg='green', fg='white', font=('Arial', 12), width=30, height=2) l.pack() # 輸入要查詢的寶貝的文字框 E1 = Text(window,width='100',height='2') E1.pack() def get_cookie(): pass def get_data(): pass # cookie獲取按鈕 cookie = Button(window, text='cookie獲取', font=('Arial', 10), width=15, height=1,ommand=get_cookie) # 資料開按鈕 data = Button(window, text='資料獲取', font=('Arial', 10), width=15, height=1,ommand=get_data) cookie.pack(anchor='nw') data.pack(anchor='nw') window.mainloop()
3、免登陸功能實現
對已經登入網站的cookie獲取
def get_cookie(): # 新建瀏覽器 dirver = webdriver.Firefox() dirver.get('https://login.taobao.com/member/login.jhtml?redirectURL=http%3A%2F%2Fbuyertrade.taobao.com%2Ftrade%2Fitemlist%2Flist_bought_items.htm%3Fspm%3D875.7931836%252FB.a2226mz.4.66144265Vdg7d5%26t%3D20110530') # 設定登入延時獲取cookie time.sleep(20) # 直接用手機掃碼登陸淘寶即可獲取 dictCookies = dirver.get_cookies() # 登入完成後,將cookies儲存到本地檔案 jsonCookies = json.dumps(dictCookies) with open("cookies_tao.json", "w") as fp: fp.write(jsonCookies)
讀取獲取後的cookie實現登入效果:
1)先對selenium使用的模擬瀏覽器進行下偽裝設定否則會被檢測
def get_data(): options = webdriver.FirefoxOptions() profile = webdriver.FirefoxProfile() ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' profile.set_preference('general.useragent.override', ua)#UA偽裝 profile.set_preference("dom.webdriver.enabled", False) # 設定非driver驅動 profile.set_preference('useAutomationExtension', False) # 關閉自動化提示 profile.update_preferences() # 更新設定 browser = webdriver.Firefox(firefox_profile=profile, firefox_options=options)
2)讀取獲取到的cookie實現免登陸
# 刪除原有的cookie browser.delete_all_cookies() with open('cookies_tao.json', encoding='utf-8') as f: listCookies = json.loads(f.read()) # cookie 讀取傳送 for cookie in listCookies: # print(cookie) browser.add_cookie({ 'domain': '.taobao.com', # 此處xxx.com前,需要帶點 'name': cookie['name'], 'value': cookie['value'], 'path': '/', 'expires': None })
4、解析網頁進行資料獲取
# 獲取輸入框中的資訊 thing =E1.get('1.0','end') # 設定將要採集的URL地址 url= "https://s.taobao.com/search?q=%s" # 設定採集的商品名稱 browser.get(url%thing) # 視窗最小化 browser.minimize_window() # 獲取商品總頁數 page_count = browser.find_element_by_xpath('/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[1]').text page_count = int(page_count.split(' ')[1]) # 設定接收字典 dic = {'real_title':[],'price':[],'payment_num':[],'provide':[],'city':[],'shop_name':[],'shop_url':[]} # 迴圈翻頁設定 for i in range(page_count): page = i*44 browser.get(url%thing + '&s=%d'%page) div_list = browser.find_elements_by_xpath('//div[@class="ctx-box J_MouseEneterLeave J_IconMoreNew"]') # 迴圈遍歷商品資訊 for divs in div_list: # 商品標題獲取 real_title = divs.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text # 商品價格獲取 price = divs.find_element_by_xpath('.//div[@class="price g_price g_price-highlight"]/strong').text # 商品付款人數獲取 payment_num = divs.find_element_by_xpath('.//div[@class="deal-cnt"]').text # 店家地址獲取 location = divs.find_element_by_xpath('.//div[@class="row row-3 g-clearfix"]/div[@class="location"]').text # 店家名稱獲取 shop_name = divs.find_element_by_xpath('.//div[@class="row row-3 g-clearfix"]/div[@class="shop"]/a/span').text # 店家URL獲取 shop_url = divs.find_element_by_xpath('.//div[@class="row row-3 g-clearfix"]/div[@class="shop"]/a').get_attribute('href') # 判斷地址是否為自治區或直轄市 if len(location.split(' '))>1: provide=location.split(' ')[0] city=location.split(' ')[1] else: provide=location.split(' ')[0] city = location.split(' ')[0] # 將採集的資料新增至字典中 dic['real_title'].append(real_title) dic['price'].append(price) dic['payment_num'].append(payment_num.replace('+人付款','')) dic['provide'].append(provide) dic['city'].append(city) dic['shop_name'].append(shop_name) dic['shop_url'].append(shop_url) print(real_title,price,payment_num.replace('+人付款',''),provide,city,shop_name,shop_url) # 使用pandas將獲取的資料寫入csv檔案持久化儲存 df=pd.DataFrame(dic) df.to_csv('C:/Users/admin/Desktop/'+thing.strip('\n')+'.csv') browser.close()
截止至此基本完成
發現這樣的資料寫入是不會儲存的所以要新增一個提示框來終止get_data函式的執行
def warning(): # 彈出對話方塊 result = tkinter.messagebox.showinfo(title = 'success!',message='主人!資料獲取完成') # 返回值為:ok
在get_data函式中巢狀warning函式.
-----完活下班!!!!-----