999宝藏网

 找回密码
 

QQ登录

只需一步,快速开始

  • 16阅读
  • 0回复

[[Windows]] 【python小白】知乎热评爬虫 单exe文件

[复制链接]

71

主题

73

帖子

272

积分

宝藏初中生

Rank: 5Rank: 5

帖子
73
金币
194
威望
0
积分
272
股份
0
热心值
1
宝藏币
0
发表于 2020-5-26 17:34:43 | 显示全部楼层 |阅读模式
小白第二次发帖,如有不当请及时删除!
这次我给大家带来的是 知乎热评爬虫
这是界面展示:


以下是爬取结果展示:




爬取的结果是excel,然后再评论里面有一些啥的,我没有删除,不是因为我懒得写代码,是因为里面还有图片链接,我不想动这个格式,如果你们有需要的话,完全可以自己再整理成文章。我这是保留了文本的原始性。
还有写注意事项都在软件上写了,有啥问题再问吧,实在是太困了。。
我认为我十一点就可以发出来,但是文件太大了,又就开始学虚拟环境打包。然后还有各种各样奇奇怪怪的问题。。。。
到现在4点了,狗命都快没了~~
源码:
[Python] 纯文本查看 复制代码# -*- coding:utf-8 -*-import requestsfrom lxml import etreeimport pandas as pdimport jsonfrom openpyxl import Workbookfrom openpyxl.utils.dataframe import dataframe_to_rowsimport datetimefrom PySide2.QtWidgets import QApplication, QMessageBox,QFileDialog,QHeaderView,QAbstractItemView,QTableWidgetItemfrom PySide2.QtUiTools import QUiLoaderimport threadingimport osfrom PySide2.QtGui import  QIconclass Download:    def __init__(self):        self.ui = QUiLoader().load('知乎.ui')        self.ui.cookies_button.clicked.connect(self.get_cookies)        self.ui.catch_button.clicked.connect(self.find_hot)        self.ui.save_button.clicked.connect(self.save2)        self.cookies = 0000        self.df = 0000        self.ui.hot_list.horizontalHeader().resizeSection(0, 80)        self.ui.hot_list.horizontalHeader().resizeSection(1, 400)        # self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)        self.ui.hot_list.setEditTriggers(QAbstractItemView.NoEditTriggers)        self.hot_list = 0000        #self.ui.hot_list.setEditTriggers(QAbstractItemView.NoEditTriggers)    def get_cookies(self):        if len(threading.enumerate()) >= 2:            QMessageBox.about(self.ui,                              '警告',                              '正在下载!!'                              )            return        self.ui.cookies_edit.clear()        self.ui.cookies_edit.paste()        self.cookies = self.ui.cookies_edit.toPlainText()    def find_hot(self):        if len(threading.enumerate()) >= 2:            QMessageBox.about(self.ui,                              '警告',                              '正在下载!!'                              )            return        if self.cookies == 0000:            QMessageBox.about(self.ui,                              '警告',                              '你还没有粘贴进去cookies!下载个锤子'                              )            return        rows = self.ui.hot_list.rowCount()        for row in range(rows):            self.ui.hot_list.removeRow(0)        url = 'https://www.zhihu.com/hot'        headers = {            'user-agent': '''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36''',            'cookie': self.cookies        }        try:            response = requests.get(url, headers=headers)        except:            self.ui.hot_list.insertRow(0)            item = QTableWidgetItem('错误!')            self.ui.hot_list.setItem(0, 0, item)            item = QTableWidgetItem('cookies可能有误,无误的话就重启软件试试~')            self.ui.hot_list.setItem(0, 1, item)            return        html = response.text        html = etree.HTML(html)        url_list = html.xpath('''//div[@class='HotList-list']/section/div[@class="HotItem-content"]/a/@href''')        title_list = html.xpath('''//div[@class='HotList-list']/section/div[@class="HotItem-content"]/a/@title''')        hot_nums = html.xpath('''//div[@class='HotList-list']/section/div[@class="HotItem-content"]/div/text()''')        data = {            'url': url_list,            'title': title_list,            'hot': hot_nums        }        df = pd.DataFrame(data)        try:            df1 = pd.DataFrame(list(df['url'].str.split('/')))        except AttributeError:            self.ui.hot_list.insertRow(0)            item = QTableWidgetItem('错误!')            self.ui.hot_list.setItem(0, 0, item)            item = QTableWidgetItem('你可拉倒吧,cookies明显有误!')            self.ui.hot_list.setItem(0, 1, item)            return        df = df.join(df1[[3, 4]])        df = df.rename(columns={3: 'isque', 4: 'pid'})        df = df[df['isque'] == 'question']        for i in range(len(df)):            dftemp = df.loc            row = self.ui.hot_list.rowCount()            self.ui.hot_list.insertRow(row)            item = QTableWidgetItem(str(dftemp['hot']))            self.ui.hot_list.setItem(row, 0, item)            item = QTableWidgetItem(str(dftemp['title']))            self.ui.hot_list.setItem(row, 1, item)        self.df = df    def save2(self):        if len(threading.enumerate()) >= 2:            QMessageBox.about(self.ui,                              '警告',                              '正在下载!!'                              )            return        print(type(self.df))        try:            if self.df == 0000:                QMessageBox.about(self.ui,                                  '警告',                                  '你还没有获取,保存个锤子',                                  )                return        except ValueError:            pass        df = self.df        filePath = QFileDialog.getExistingDirectory(self.ui, "选择存储路径")        if filePath == '':            return        def get_comments(df,cookies):            pid = df['pid']            comm_list = []            print(f'正在爬pid={pid}')            for i in range(1, 100, 20):                print(f'其中第{i}个')                url = f'https://www.zhihu.com/api/v4/questions/{pid}/answers?include=data%5B%2A%5D.is_normal%2CADmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%2Cis_recognized%2Cpaid_info%2Cpaid_info_content%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%2A%5D.topics&limit=20&offset={i}&platform=desktop&sort_by=default'                headers = {                    'user-agent': '''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36''',                    'cookie': cookies                }                res = requests.get(url, headers=headers)                res.encoding = 'utf-8'                html = res.text                data = json.loads(html)['data']                if data == []:                    break                df2 = pd.DataFrame(data)                df3 = pd.DataFrame(list(df2['author']))                df3 = df3[['name', 'url_token', 'user_type', 'headline']]                df4 = df3.merge(df2[['content', 'voteup_count', 'comment_count']], left_index=True, right_index=True)                comm_list.append(df4)            a = comm_list[0]            for j in comm_list[1:]:                a = a.append(j, ignore_index=True)            return a        def thr(df,ui,cookies):            hot_list = []            for i in df.index:                ui.download_edit.append(f'正在爬第{i + 1}个')                ui.download_edit.ensureCursorVisible()                comments = get_comments(df.loc,cookies)                hot_list.append(comments)                #break            ui.download_edit.append('终于下载完了,正在保存')            ui.download_edit.ensureCursorVisible()            wb = Workbook()            ws = wb.active            for row in dataframe_to_rows(df[['url', 'title', 'hot']], index=False, header=True):                ws.append(row)            count = 1            for df0 in hot_list:                title = f'排行第{count}'                wb.create_sheet(title=title)                sheet = wb[title]                for r in dataframe_to_rows(df0, index=False, header=True):                    sheet.append(r)                count += 1            file_time = str(datetime.datetime.now())[:-7]            file_time = file_time.replace(":", '-')            file_name = f"知乎热评{file_time}.xlsx"            wb.save(filePath + '\\' + file_name)            # QMessageBox.about(ui,            #                   '通知',            #                   '久等了,终于下载完成了'            #                   )        t1 = threading.Thread(target=thr,args=[df,self.ui,self.cookies])        t1.start()app = QApplication([])app.setWindowIcon(QIcon('0.png'))d = Download()d.ui.show()app.exec_()os._exit(0)
说实话我不太喜欢公布自己的源码,虽然我菜,我也不想被抄。而且说实话写这点代码也费了不少脑子和好多精力。(主要是灵感一来就想爆肝)
不过嘛,不放源码怕你们不放心。。
爬虫是单线程下载,所以没那么快。多线程太麻烦了,还要排序啥的。。。不过也不算慢,五分钟之内吧,没计时也。
其中找自己cookies应该大家都会吧?F12找嘛。
这软件68M,脚本10K。我也是醉了,一开始280M,到68m我已经是没用办法再抵抗了。。。请见谅哈~
希望大家给个回复支持啦,谢谢啦。。。
刚才忘记放文件了:
游客,如果您要查看本帖隐藏内容请回复










1.发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;微笑

2.如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;微笑

3.如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【金币】加分不会扣除自己的积分,做一个热心并受欢迎的人!微笑

回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

返回列表

|999宝藏网|sitemap|手机版|举报|申请友情链接|  

免责声明:

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表999宝藏网立场!

999宝藏网论坛所发布的一切破解软件和补丁、注册机以及注册信息,仅限用于学习和研究目的。不得将上述内容用于商业或者非法途径!否则,一切后果请用户自负!

我们不生产软件,我们只是互联网上的搬运工,本站信息来自互联网,版权争议与本站无关,如果您喜欢该程序,请购买注册正版软件,获得正版优质服务!

请重视此声明,法律不容忽视!请支持正版,尊重版权!本站如有信息侵犯了您的权益,请联系:www@rin99.com及时删除!

Powered by Discuz! © 2001-2020 Comsenz Inc. (豫ICP备16009175号) 备案图标 豫公网安备41142602000006号

Copyright © 2016-2020 999宝藏网 版权所有 All Rights Reserved.

GMT+8, 2020-9-19 00:51 , Processed in 0.080275 second(s), 11 queries , Redis On.

快速回复 返回顶部 返回列表