加班時的靈感迸發,我用selenium做了個窗口化的爬*寶數據。(附源碼鏈接)
完整代碼&火狐瀏覽器驅動下載鏈接://pan.baidu.com/s/1pc8HnHNY8BvZLvNOdHwHBw 提取碼:4c08
雙十一剛過,想着某寶的信息看起來有些少很難做出購買決定。於是就有了下面的設計:
既然有了想法那就趕緊說干就干趁着雙十二還沒到
一、準備工作:
安裝 :selenium 和 tkinter
pip install selenium
pip install tkinter
下載火狐瀏覽器驅動
二、網站分析
發現web端如果不登錄就不能進行查找商品
登錄後查找口紅
發現url竟然張這樣
//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('//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= "//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函數.
—–完活下班!!!!—–