• 随手笔记--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)。

  • 相关阅读:
    利用 Avisynth 2.5.8 的 ColorKeyMask 功能实现视频抠像
    Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1
    call、apply、bind
    网络模型
    搜索关键字变色突出显示
    面向过程与面向对象编程的区别和优缺点
    webpack打包体积优化---插件 webpack-bundle-analyzer
    百度搜索关键词特效
    DNS原理及其解析过程
    亿级高并发数据库调优与最佳实践法则
  • 原文地址:https://www.cnblogs.com/wenqiang-leo/p/11610692.html
Copyright © 2020-2023  润新知