吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11796|回复: 61
收起左侧

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

  [复制链接]
丶霁灵 发表于 2020-5-26 03:57
本帖最后由 丶霁灵 于 2020-5-26 12:49 编辑

小白第二次发帖,如有不当请及时删除!


这次我给大家带来的是 知乎热评爬虫
这是界面展示:

以下是爬取结果展示:


爬取的结果是excel,然后再评论里面有一些<p>啥的,我没有删除,不是因为我懒得写代码,是因为里面还有图片链接,我不想动这个格式,如果你们有需要的话,完全可以自己再整理成文章。我这是保留了文本的原始性。
还有写注意事项都在软件上写了,有啥问题再问吧,实在是太困了。。

我认为我十一点就可以发出来,但是文件太大了,又就开始学虚拟环境打包。然后还有各种各样奇奇怪怪的问题。。。。
到现在4点了,狗命都快没了~~


源码:
[Python] 纯文本查看 复制代码
# -*- coding:utf-8 -*-
import requests
from lxml import etree
import pandas as pd
import json
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import datetime
from PySide2.QtWidgets import QApplication, QMessageBox,QFileDialog,QHeaderView,QAbstractItemView,QTableWidgetItem
from PySide2.QtUiTools import QUiLoader
import threading
import os
from PySide2.QtGui import  QIcon

class 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']

        df = df.reset_index(drop=True)# 我加了这一行

        for i in range(len(df)):
            dftemp = df.loc[i]
            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[i],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我已经是没用办法再抵抗了。。。请见谅哈~
希望大家给个回复支持啦,谢谢啦。。。

之前有一个小(da)bug,有时间性。因为有时候知乎的热榜有时候会有盐选故事,不是问题。
555.png 444.png
是相当于知乎的广告,直接删掉导致index空缺,现在加了一段就好了~~
文件更新啦~有问题接着问吧:
https://lanzouj.com/id0a59c
33333.png
批注 2020-05-26 033119.png
批注 2020-05-26 033030.png
1111111.png
222222.png

免费评分

参与人数 41吾爱币 +35 热心值 +35 收起 理由
wei862276141 + 1 我很赞同!
xuejiqiao + 1 + 1 感谢分享,谢谢分享
正中间 + 1 + 1 用心讨论,共获提升!
幺幺幺、贰 + 1 + 1 谢谢@Thanks!
shitou123 + 1 + 1 &amp;lt;font style=&amp;quot;vertical-align: inherit;&amp;quot;&amp;gt;&amp;lt;font style=
Moyuan + 1 + 1 热心回复!
5721 + 1 + 1 我很赞同!
银庭之主 + 1 + 1 我很赞同!
昵称003 + 1 用心讨论,共获提升!
优秀 + 1 &amp;lt;font style=&amp;quot;vertical-align: inherit;&amp;quot;&amp;gt;&amp;lt;font style=
zhangdashan391 + 1 谢谢@Thanks!
Mamama + 1 没有CB了
yeah52 + 1 + 1 谢谢@Thanks!
WANGfanr + 1 + 1 用心讨论,共获提升!
PhilXholder + 1 我很赞同!
nndyky + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
黄sir + 1 我很赞同!
ivan51769 + 1 + 1 优秀,我还在基础呢
paguco + 1 + 1 热心回复!
斌之城 + 1 + 1 我很赞同!
哇哈哈大笑 + 1 + 1 热心回复!
cx2020 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Rian_然 + 1 + 1 都爆肝了 我就不能白嫖,分送你
pibyaya + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiaiyue + 1 冲着你的一句,4点了,狗命都没了,加分,哈哈哈哈
不想当咸鱼 + 1 + 1 谢谢@Thanks!
淅沥西里 + 1 + 1 热心回复!
liwenbiaogg + 1 + 1 众所周知 程序员都是段子手
tljiaqing + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wx9265661 + 1 + 1 谢谢@Thanks!
云儿筱筱 + 1 谢谢@Thanks!
swhzxzx + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
huangdc1987 + 1 + 1 热心回复!
chensweet + 1 + 1 谢谢@Thanks!
yanglinman + 1 谢谢@Thanks!
hshcompass + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qq63 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
RyanEdward + 1 + 1 谢谢@Thanks!
qs1120 + 1 用心讨论,共获提升!
geniusrot + 2 + 1 大佬加油
joneqm + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 丶霁灵 发表于 2020-5-26 03:58
给自己个沙发,睡觉了~~
hsyz1016 发表于 2020-5-31 18:26
hsyz1016 发表于 2020-5-31 18:13
cookie填入不正确,有同样问题的吗?

"SESSIONID=6OVcxi24230vPL5Qbd9me5R897AZ4C2d013yGNBcExk;
JOID=VFgVA0nRjnkY79bMY9ccp3lmcZR0rfcDc7OeqiuA7zZNhOeHNSYMqEDt0MxhVXdJCxS7jEbXC1m3zuQkhyuchhw=;
osd=UFgQAULVjnwa5NLMZtUXo3ljc59wrfIBeLeerymL6zZIhuyDNSMOo0Tt1c5qUXdMCR-_jEPVAF23y-YvgyuZhBc=;
_zap=7197197a-6d6e-4223-a0c0-e14e3401830e; d_c0="AEDd18VCWRGPTkWgEehniLAjXwxnTIhEaMQ=|1590827969";
_ga=GA1.2.266101976.1590827969; _xsrf=NtWLsUTOnHvceDkNiHQ5Y1avDHnoWrQj;
_gid=GA1.2.1777412512.1590918881; SESSIONID=zyziXNfHUgOUi5MVPoqI13K28QCI6iXFi9rQ2AfOprO;
JOID=UFEcAkiOqImHDBEYIo0iWIGTj0g4_9H77FVUfmLaxMbaZyVedGbeUNoGGhAoXnusMSLVAkqOvExDLlrnNx_3eNA=;
osd=VVgQBkmLoYWDDRQRLokjXYifi0k99t3_7VBdcmbbwc_WYyRbfWraUd8PFhQpW3KgNSPQC0aKvUlKIl7mMhb7fNE=;
q_c1=b72e30bcf728466498001a7743206ec7|1590918926000|1590918926000;
Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1590827969,1590918881,1590919918;
Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1590919918;
KLBRSID=af132c66e9ed2b57686ff5c489976b91|1590920104|1590918879"
jiupeak 发表于 2020-5-26 03:59
geniusrot 发表于 2020-5-26 06:23
易语言好玩点!直接把关键代码封装到模块了!?然后源码啥也看不到
98km6 发表于 2020-5-26 06:45
好崇拜楼主,谢谢,
头像被屏蔽
yl2678 发表于 2020-5-26 06:53
提示: 作者被禁止或删除 内容自动屏蔽
RyanEdward 发表于 2020-5-26 07:03
感谢分享,对学爬虫很有帮助
jinxin6670 发表于 2020-5-26 07:06
瞅瞅好不好玩
wkjxs2015 发表于 2020-5-26 07:15
看对话框好有趣,有吾爱的风格。
楚玉无尘 发表于 2020-5-26 07:26
可以可以,很棒
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 14:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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