u010263350
爬吧爬吧
2021-03-24 17:20
采纳率: 100%
浏览 65

求助求助,麻烦大佬们帮忙看下def online(self): while True:为什么不运行?

import datetime
import time
from tkinter import Tk, Button, Entry, Label, Text, END, Scrollbar, Listbox
import requests
# 调用BeautifulSoup库
from bs4 import BeautifulSoup
from numpy.core.defchararray import strip


# 币圈快讯代码,输出内容将放入界面的'币圈快讯'的Text框中
class News:
    def __init__(self):
        pass

    # 币世界爬虫代码,已调试好
    def bishijie_news(self):
        # 币世界快讯打印及保存
        list_news1 = []
        res = requests.get('https://www.bishijie.com/')
        html = res.text
        soup = BeautifulSoup(html, 'html.parser')
        items = soup.find_all('div', class_='content')
        for item in items:
            title = item.find('h3')
            time_title = title.text.replace(' ', '')
            content = item.find(class_='h63')
            short = item.find('div', class_='bear')
            long = item.find('div', class_='bull')
            title_use = str(strip(time_title))
            content_use = str(strip(content.text))
            long_market = str(strip(long.text))
            short_market = str(strip(short.text))
            # 获取本地时间
            date = datetime.date.today()
            space = '====______________币世界最新快讯______________===='
            news = '\n'.join([space, '\n', str(date), title_use, content_use, long_market, short_market, '\n'])
            list_news1.append(news)
            print('{}\n'.format(space))
            # 现在时间和标题混淆一块,后面需要拆开处理
            print('{} {} \n内容:{} \n多空:{}|{} \n'.format(date, strip(time_title),
                                                       strip(content.text), strip(long.text),
                                                       strip(short.text)))
        return '\n'.join(list_news1)

    # 金色财经爬虫,已调试好
    def jinsecaijing_news(self):
        res = requests.get('https://api.jinse.com/noah/v2/lives?limit=20&reading=false&source=web&flag=down&id=0'
                           '&category=0 ')
        json_jinse = res.json()
        news_list = json_jinse['list'][0]['lives']
        list_news2 = []
        for new in news_list:
            space = '====______________金色财经最新快讯______________===='
            new_time = new['created_at']
            format_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(new_time))
            new_title = new['content_prefix']
            new_content = new['content']
            list_new = [space, '\n', format_time, new_title, new_content, '\n']
            list_news2.append('\n'.join(list_new))

        # print('{}\n'.format(space))
        '''print('{}\n{}\n{}\n'.format(format_time, new_title, new_content))'''
        return '\n'.join(list_news2)


# Tkinter写的显示界面,已调试
class Application:
    def __init__(self):
        self.window = Tk()
        self.news = News()

        # 生成软件图形界面
        # 设置窗口名称
        self.window.title(u'币圈最新资讯')
        # 设置窗口大小和位置,设置移动窗口的距离
        self.window.geometry('900x900+300+400')
        # 创建4个田字分布的文本框,用来接收和显示帕取的数据

        # 创建币圈快讯的label标签,用于指示文本框内容
        self.bishijie = Label(self.window, text='币圈快讯', bg='orange', font=('Arial', 12), width=4, height=2)
        self.bishijie.place(x=200, y=50, width=100, height=20)
        # 创建第1个文本框,用于接收快讯
        self.news_text = Text(self.window, background='azure')
        self.news_text.place(x=40, y=70, width=400, height=330)

        # 滑动条,未运行成功,待继续写,您忽略就好
        '''
        sb = Scrollbar(self.news_text)
        sb.pack(side='right', fill='y')
        lb = Listbox(self.news_text, yscrollcommand=sb.set)
        for i in self.news.bishijie_news():
            lb.insert(END, str(i))
        lb.place(x=0, y=0, width=400, height=320)
        sb.config(command=lb.yview)
        '''

        # 创建币圈最新项目的label标签,用于指示文本框内容
        self.project = Label(self.window, text='最新项目', bg='orange', font=('Arial', 12), width=4, height=2)
        self.project.place(x=620, y=50, width=100, height=20)
        # 创建第2个文本框,用于接收爬取的项目信息
        self.project_text = Text(self.window, background='azure')
        self.project_text.place(x=460, y=70, width=400, height=330)

        # 创建微信聊天记录的label标签,用于指示文本框内容
        self.project = Label(self.window, text='微信聊天记录', bg='orange', font=('Arial', 12), width=4, height=2)
        self.project.place(x=200, y=400, width=100, height=20)
        # 创建第3个文本框,用于抓取的微信群聊天记录
        self.wechat_text = Text(self.window, background='azure')
        self.wechat_text.place(x=40, y=420, width=400, height=330)

        # 创建交易所公告的label标签,用于指示文本框内容
        self.project = Label(self.window, text='交易所公告', bg='orange', font=('Arial', 12), width=4, height=2)
        self.project.place(x=620, y=400, width=100, height=20)
        # 创建第4个文本框,用于抓取的交易所公告信息
        self.exchange_text = Text(self.window, background='azure')
        self.exchange_text.place(x=460, y=420, width=400, height=330)

    # 将币世界爬虫和金色财经爬虫获取的内容,放入到币圈快讯的Text栏中
    def submit(self):
        result1 = self.news.bishijie_news()
        result2 = self.news.jinsecaijing_news()
        self.news_text.insert(END, result1)
        self.news_text.insert(END, result2)

    def run(self):
        self.window.mainloop()


# 指示上述爬虫代码和界面代码每10秒运行一次的class类
class Total:
    def __init__(self):
        self.Application = Application()

    def online(self):
        while True:
            self.Application.submit()
            self.Application.run()
            time.sleep(10)


if __name__ == "__main__":
    news = Total()
    news.online()

因为工作需要所以想写一个按照各个指标提示进行比特币交易的小软件,所以这两天先写了一个快讯爬虫,因为实在懒得翻各种资讯APP软件。

代码的结构:

class News是两个爬虫部分,爬虫代码已经调试好了,单独拿出来加上time.sleep(10)的话可以正常每10秒执行一次;

class Application是用Tkinter写的简单的显示界面,当然现在只写了资讯爬取,而且资讯这块按时间排序、只爬取之前未爬取内容的几个小功能等都没写。

class Total是调用上述两个class里的方法然后while True按time.sleep()10秒钟循环一次。

现在的问题是while True好像无法执行,在运行出的界面能显示当前此次执行时的内容,但是10秒后不更新快讯内容。

PS:刚学python两个月,以前没写过程序,现在爬虫刚学到协程这块,大佬们轻喷。我问了课程指导的老师,他们也不知道问题在哪。。。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • qq_38084396
    芫尘梦 2021-03-25 10:24
    已采纳

    self.Application.run() 阻塞了 程序无法继续往下执行

    点赞 1 评论
  • u010263350
    爬吧爬吧 2021-03-24 19:40

    为啥没人啊。。。。

    点赞 评论
  • u010263350
    爬吧爬吧 2021-03-24 19:40

    大佬快来教教我啊。。。😭😭

    点赞 评论
  • u010263350
    爬吧爬吧 2021-03-25 00:42

    用tkinter库的after函数调好了,10秒刷新一次,好活👌

    点赞 评论
  • u010263350
    爬吧爬吧 2021-03-25 12:19

    问题已经解决,谢谢@芫尘梦大佬指点。附上完整代码。😄

    import datetime
    import time
    from tkinter import Tk, Button, Entry, Label, Text, END, Scrollbar, Listbox
    import requests
    # 调用BeautifulSoup库
    from bs4 import BeautifulSoup
    from numpy.core.defchararray import strip
    
    
    # 币圈快讯代码,输出内容将放入界面的'币圈快讯'的Text框中
    class News:
    
        # 币世界爬虫代码,已调试好
        def bishijie_news(self):
            # 币世界快讯打印及保存
            list_news1 = []
            res = requests.get('https://www.bishijie.com/')
            html = res.text
            soup = BeautifulSoup(html, 'html.parser')
            items = soup.find_all('div', class_='content')
            for item in items:
                title = item.find('h3')
                time_title = title.text.replace(' ', '')
                content = item.find(class_='h63')
                short = item.find('div', class_='bear')
                long = item.find('div', class_='bull')
                title_use = str(strip(time_title))
                content_use = str(strip(content.text))
                long_market = str(strip(long.text))
                short_market = str(strip(short.text))
                # 获取本地时间
                date = datetime.date.today()
                space = '====______________币世界最新快讯______________===='
                news = '\n'.join([space, '\n', str(date), title_use, content_use, long_market, short_market, '\n'])
                list_news1.append(news)
                print('{}\n'.format(space))
                # 现在时间和标题混淆一块,后面需要拆开处理
                print('{} {} \n内容:{} \n多空:{}|{} \n'.format(date, strip(time_title),
                                                           strip(content.text), strip(long.text),
                                                           strip(short.text)))
            return '\n'.join(list_news1)
    
        # 金色财经爬虫,已调试好
        def jinsecaijing_news(self):
            res = requests.get('https://api.jinse.com/noah/v2/lives?limit=20&reading=false&source=web&flag=down&id=0'
                               '&category=0 ')
            json_jinse = res.json()
            news_list = json_jinse['list'][0]['lives']
            list_news2 = []
            for new in news_list:
                space = '====______________金色财经最新快讯______________===='
                new_time = new['created_at']
                format_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(new_time))
                new_title = new['content_prefix']
                new_content = new['content']
                list_new = [space, '\n', format_time, new_title, new_content, '\n']
                list_news2.append('\n'.join(list_new))
    
            # print('{}\n'.format(space))
            '''print('{}\n{}\n{}\n'.format(format_time, new_title, new_content))'''
            return '\n'.join(list_news2)
    
    
    # Tkinter写的显示界面,已调试
    class Application(News):
    
        def __init__(self):
            super().__init__()
            self.window = Tk()
    
            # 生成软件图形界面
            # 设置窗口名称
            self.window.title(u'币圈最新资讯')
            # 设置窗口大小和位置,设置移动窗口的距离
            self.window.geometry('900x900+300+400')
            # 创建4个田字分布的文本框,用来接收和显示帕取的数据
            # 创建币圈快讯的label标签,用于指示文本框内容
            self.bishijie = Label(self.window, text='币圈快讯', bg='orange', font=('Arial', 12), width=4, height=2)
            self.bishijie.place(x=190, y=50, width=100, height=20)
            # 创建第1个文本框,用于接收快讯
            self.news_text = Text(self.window, background='gray95')
            self.news_text.place(x=40, y=70, width=400, height=330)
    
            # 滑动条,未运行成功,待继续写,您忽略就好
    
            # 创建币圈最新项目的label标签,用于指示文本框内容
            self.project = Label(self.window, text='最新项目', bg='orange', font=('Arial', 12), width=4, height=2)
            self.project.place(x=620, y=50, width=100, height=20)
            # 创建第2个文本框,用于接收爬取的项目信息
            self.project_text = Text(self.window, background='gray95')
            self.project_text.place(x=460, y=70, width=400, height=330)
    
            # 创建微信聊天记录的label标签,用于指示文本框内容
            self.project = Label(self.window, text='微信聊天记录', bg='orange', font=('Arial', 12), width=4, height=2)
            self.project.place(x=190, y=400, width=100, height=20)
            # 创建第3个文本框,用于抓取的微信群聊天记录
            self.wechat_text = Text(self.window, background='gray95')
            self.wechat_text.place(x=40, y=420, width=400, height=330)
    
            # 创建交易所公告的label标签,用于指示文本框内容
            self.project = Label(self.window, text='交易所公告', bg='orange', font=('Arial', 12), width=4, height=2)
            self.project.place(x=620, y=400, width=100, height=20)
            # 创建第4个文本框,用于抓取的交易所公告信息
            self.exchange_text = Text(self.window, background='gray95')
            self.exchange_text.place(x=460, y=420, width=400, height=330)
    
    
    # 指示上述爬虫代码和界面代码每10秒运行一次的class类
    class Total(Application):
    
        def refresh_text(self):
            self.result2 = News.jinsecaijing_news(self)
            self.result1 = News.bishijie_news(self)
            self.news_text.delete(0.0, END)
            self.news_text.insert(END, self.result2)
            self.news_text.insert(END, self.result1)
            self.news_text.update()
            self.window.after(5000, self.refresh_text)
    
        def refresh_total(self):
            self.refresh_text()
            self.window.after(5000, self.refresh_text)
            self.window.mainloop()
    
    
    if __name__ == "__main__":
        news = Total()
        news.refresh_total()
    
    点赞 评论
  • u010263350
    爬吧爬吧 2021-03-25 14:58

    写Total类里refresh_text方法的时候,self.result1、self.result2如果按照pycharm提示,创建__init__单独放出去,会使self.result1、self.result2脱离递归只执行一次,所以必须放到refresh_text函数里,才能参与递归持续运行。这个坑坑了我一个小时。

    点赞 评论

相关推荐