随手笔记--tkinter pyinstaller(玩玩爬虫)

# 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 爬虫.py


-F, –onefile 打包成一个exe文件。
-D, –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。
-c, –console, –nowindowed 使用控制台,无界面(默认)
-w, –windowed, –noconsole 使用窗口,无控制台

1.命令使用pyinstaller和pyinstaller.exe结果都是一样的

2.-w是不显示命令窗口,  -i 图标文件的路径  这是改变图标的,但是我发现只能改变任务栏里的和命令窗口的图标,并不能改变exe文件的图标。另外这些参数要加载pyinstaller和路径中间。

3.有一些代码需要调用一些图片和资源文件的,这是不会自动导入的,需要你自己手动复制进去才行。不然exe文件运行时命令窗口会报错找不到这个文件。

4.也是最坑的一点。就是当你使用错误的参数去打包或者打包到一半中断,等等此类运行到一半没了的情况。会导致你原来的py文件变成一个0KB的空文件。里面的代码会全部消失!!!所以以后需要有个良好的习惯,就是复制一份代码出来,用这个副本进行打包。并且参数出错,或者打错了导致失败时,检查下副本文件的py文件是否还存在再继续重新打包,不然打出来的就是空的文件,自然一直闪退,因为压根没内容。

5.写代码的时候应当有个良好的习惯,用什么函数导什么函数,不要上来import整个库,最后你会发现你一个100KB的代码打包出来有500MB,全是库,简直无语

6.pygame代码调试的时候要用quit()不然程序结束时会崩溃。但是直接运行py文件就不需要这个函数。这个我们之前的文章也提到过了。但是这里当我使用-w做成无窗口的程序后,一结束发现报错,暂停后发现报的是找不到quit()函数。可见这个函数其实是一个很让人无语的函数。一方面pygame官方网上说结束程序的时候需要加入这个函数。另一方面其实在正在运行时都不需要甚至会报错。虽然也不影响运行,但是弹个窗口出来说 什么不fail to execute总是让别人觉得你是个lowb。所以,调试的时候加一下,到时候execute的时候去掉。

-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)。

原文地址:https://www.cnblogs.com/wenqiang-leo/p/11610692.html