加班時的靈感迸發,我用selenium做了個視窗化的爬*寶資料。(附原始碼連結)

佟大帥發表於2021-11-17

完整程式碼&火狐瀏覽器驅動下載連結: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函式.

-----完活下班!!!!-----

相關文章