# coding : utf-8 import tkinter import requests import time import json import os import re import random import pandas as pd from bs4 import BeautifulSoup import urllib.request from lxml import etree import numpy as np from pandas import Series,DataFrame from tkinter import filedialog root=tkinter.Tk() #建立窗口 root.title('爬蟲') #窗口標題 # root.geometry('500x500')#窗口大小 root.resizable(0,0) # root.wm_attributes('-topmost', 1) global cuncu, vartext, result, fuhao,url,all_url,df00,price,df01,file_path all_canshu,yuan_price,lianjie = [],[],[] df01 = pd.DataFrame() df00 = pd.DataFrame() result = fuhao = file_path=None vartext = tkinter.StringVar() cuncu = [] #存入 class get_data: global price, vartext, all_canshu, yuan_price,df00 def __init__(self,can): self.can = can def get_html(self): url=self.can header = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36',\ 'Referer':'https://item.taobao.com/item.htm'} session = requests.Session() user_list=[ 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36', 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1', 'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;', 'Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50', 'Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11', 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11', 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)', 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)', 'Mozilla/5.0(SymbianOS/9.4;Series60/5.0NokiaN97-1/20.0.019;Profile/MIDP-2.1Configuration/CLDC-1.1)AppleWebKit/525(KHTML,likeGecko)BrowserNG/7.1.18124' ] end_user_agent = random.choice(user_list) headers={ 'user-agent':end_user_agent, 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'X-Requested-With': 'XMLHttpRequest', 'Referer':'https://item.taobao.com/item.htm', 'cookie': 'cna=1jymFcyvAhsCAXPBUpgt9COv; hng=""; otherx=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0; x=__ll%3D-1%26_ato%3D0; lid=%E4%BD%8E%E8%B0%83wenqiang; enc=2XZmPjnoSGB9u1pRDsk377iZs5WkCpFZZiUTBpK81w4Zjl%2BFUhjSPmYt9xr0etroaXHofPMsRDQJTiBAl7tOsQ%3D%3D; pnm_cku822=; cq=ccp%3D1; _m_h5_tk=581dbf5f6f8b07e3b70890ecf8b731cb_1562480918457; _m_h5_tk_enc=fc2f52cd7cfa69010f37b77584fcdf05; t=ab7ea3bef48df392fe9d4fe28fa3882f; uc3=vt3=F8dBy34Q5AiZ9LSYPis%3D&id2=UU26%2BwkRuo5y%2FA%3D%3D&nk2=1oJkiZO1aA33ROGY&lg2=Vq8l%2BKCLz3%2F65A%3D%3D; tracknick=%5Cu4F4E%5Cu8C03wenqiang; lgc=%5Cu4F4E%5Cu8C03wenqiang; _tb_token_=eb53be7e747f8; cookie2=179e1928236f97e91af1c2f5ddd37caf; x5sec=7b2273686f7073797374656d3b32223a223636653035666635663930663239643761323032383731633931656166376465434f65356d4f6b4645496e7431654f49684f485675514561444449314f4463784f4451304e4459374d673d3d227d; swfstore=95983; isg=BC4ufETG_z8pZQvixr9aMv2ef4QwhzW90gddkFj25THLO8-VwL_POSdy8-dy5-pB; l=cBLXSMLmqEdK8YYJBOfZNuIRt3_OBIOb8oVzw4iuEICP_4CMPifRWZnrS1YHCnGVLsI9R3SgKvQUBr8KFyUIgZ5nlPVob3I1' } try: req=urllib.request.Request(url,headers=headers) response=urllib.request.urlopen(req) html = response.read().decode('gbk') return html except: vartext.set('網址獲取失敗!') def copy1(self): # tkinter.Misc().clipboard_clear() tkinter.Misc().clipboard_append(string(vartext.get()))#顯示區域 def canshu(self): geshu = 1 step = 50 for i in df00['連接']: if geshu == step: print('已處理'+str(geshu)+'個商品!!!') step+=50 try: a=get_data(i) html = a.get_html() lianjie.append(i) imdb = etree.HTML(html) price=re.findall(r'ItemPrice":"(.*?)"',html)[0] xianshi=price+' 第'+str(geshu)+'個商品!'+' 總共'+str(len(df00))+'個' vartext.set(xianshi) # root.update() yuan_price.append(re.findall(r'ItemPrice":"(.*?)"',html)[0]) #原價 if re.findall(r'ItemPrice":"(.*?)"',html)[0]: all_canshu.append(imdb.xpath(r'//ul[@id="J_AttrUL"]/li/text()')) except: all_canshu.append('') yuan_price.append('') vartext.set('失敗!') geshu+=1 root.update() time.sleep(1) df01['連接'] = lianjie df01['吊牌價'] = yuan_price df01['商品參數'] = all_canshu vartext.set('已完成!') def seav(self): name=entry5.get() path=file_path[0:file_path.rfind('/')]+'/'+name+'.xlsx' df01.to_excel(path,index=False) vartext.set('已保存!') def get_file(): global df00,file_path file_root = tkinter.Tk() file_root.withdraw() file_path = filedialog.askopenfilename() entry3.insert('insert',file_path) df00 = pd.read_excel(file_path) label=tkinter.Label(root,text='請先輸入連接',width=50,bg='red') label.grid(row=0,columnspan=3) entry1 = tkinter.Label(root, width=50, height=3, bg='yellow', anchor='w',textvariable=vartext)# anchor: 組件的對齊方式,頂對齊'n',底對齊's',左'w',右'e' 背景 :白色,對齊:底對齊 entry1.grid(row=2, columnspan=3) button1=tkinter.Button(root,text='連接',command=get_file,bg='green') button1.grid(row=3,column = 2) entry2 = tkinter.Label(root,text='選擇文件:') entry2.grid(row=3,column = 0) entry3 = tkinter.Entry(root,width=20, font=("宋體", 10, 'bold')) entry3.grid(row=3,column = 1) button3=tkinter.Button(root,text='開始',command=get_data(df00).canshu) button3.grid(row=4,columnspan=3) entry4 = tkinter.Label(root,text='保存文件:') entry4.grid(row=6,column = 0) entry5 = tkinter.Entry(root,width=20, font=("宋體", 10, 'bold')) entry5.grid(row=6,column = 1) button2=tkinter.Button(root,text='確認',command=get_data(file_path).seav,bg='green') button2.grid(row=6,column = 2) root.mainloop() #進入消息循環(必需組件)
pyinstaller -F -i b.ico 爬蟲.pyhtml
-F, –onefile 打包成一個exe文件。
-D, –onedir 建立一個目錄,包含exe文件,但會依賴不少文件(默認選項)。
-c, –console, –nowindowed 使用控制檯,無界面(默認)
-w, –windowed, –noconsole 使用窗口,無控制檯\es6
1.命令使用pyinstaller和pyinstaller.exe結果都是同樣的web
2.-w是不顯示命令窗口, -i 圖標文件的路徑 這是改變圖標的,可是我發現只能改變任務欄裏的和命令窗口的圖標,並不能改變exe文件的圖標。另外這些參數要加載pyinstaller和路徑中間。json
3.有一些代碼須要調用一些圖片和資源文件的,這是不會自動導入的,須要你本身手動複製進去才行。否則exe文件運行時命令窗口會報錯找不到這個文件。緩存
4.也是最坑的一點。就是當你使用錯誤的參數去打包或者打包到一半中斷,等等此類運行到一半沒了的狀況。會致使你原來的py文件變成一個0KB的空文件。裏面的代碼會所有消失!!!因此之後須要有個良好的習慣,就是複製一份代碼出來,用這個副本進行打包。而且參數出錯,或者打錯了致使失敗時,檢查下副本文件的py文件是否還存在再繼續從新打包,否則打出來的就是空的文件,天然一直閃退,由於壓根沒內容。cookie
5.寫代碼的時候應當有個良好的習慣,用什麼函數導什麼函數,不要上來import整個庫,最後你會發現你一個100KB的代碼打包出來有500MB,全是庫,簡直無語session
6.pygame代碼調試的時候要用quit()否則程序結束時會崩潰。可是直接運行py文件就不須要這個函數。這個咱們以前的文章也提到過了。可是這裏當我使用-w作成無窗口的程序後,一結束髮現報錯,暫停後發現報的是找不到quit()函數。可見這個函數實際上是一個很讓人無語的函數。一方面pygame官方網上說結束程序的時候須要加入這個函數。另外一方面其實在正在運行時都不須要甚至會報錯。雖然也不影響運行,可是彈個窗口出來講 什麼不fail to execute老是讓別人以爲你是個lowb。因此,調試的時候加一下,到時候execute的時候去掉。app
-h, --help | 顯示此幫助消息並退出 |
-v, --version | 顯示程序版本信息並退出。 |
--distpathDIR | 放置捆綁應用的位置(默認值:./ did) |
--workpath WORKPATH | |
在哪裏放置全部臨時工做文件,。log,.pyz等(默認值:./ build) | |
-y, --noconfirm | |
替換輸出目錄(默認值:SPECPATH / dist / SPECNAME)而不要求確認 | |
--upx-dir UPX_DIR | |
UPX實用程序的路徑(默認:搜索執行路徑) | |
-a, --ascii | 不包括unicode編碼支持(默認值:若是可用,則包含) |
--clean | 在構建以前清理PyInstaller緩存並刪除臨時文件。 |
--log-level LEVEL | |
構建時控制檯消息中的詳細信息量。LEVEL多是TRACE,DEBUG,INFO,WARN,ERROR,CRITICAL之一(默認值:INFO)。 |