python项目源码怎么看_【Python】【教程+源码】我是如何做出知乎问答收集软件的?…

我是如何制作知乎问答收集工具的p>

标签: Pyhon源码 教程

此贴仅作技术交流,禁止潜伏在论坛的无良商家把我的源码打包了拿出去卖!

之前发过一款软件知乎问答收集器,没想到有这么多人喜欢,我看到评论区还有和我一样的Pyhon爱好者求源码,那么今天源码来啦!这次的源码跟我以前发的代码思路有点不一样了,这次采用严格面向对象的编程思想来写的代码,小白看起来可能就比较吃力了,所以我大概讲解一下,如果讲得不好也请大佬轻喷,本次编程使用的知识点主要有以下:

面向对象的编程方法,代码里一切皆为对象

Tkinter包的使用,绘出普通用户也能使用的软件界面

伪装请求头headers,使 站无法辨认出访问它的是Python还是浏览器。

利用cookie登陆,解除未登录用户只能爬取一页的限制。

分析ajax请求,推测每个参数代表的意义。

利用json包解析返回的json数据

用csv包把数据存储在csv文件中(Excel可以直接打开)

既然找到了我们需要的包,那么我们来看看这个包是怎么得到的,就是右边这一长串链接了,我们可以看到最后有两个参数,offset和limit,然后我把这段链接放在Python里模拟请求,并改变这两个参数的值发现,offset就表示你从第几个回答开始,limit是一次请求多少个回答,那这样就简单了,我们只需要设定limit为某一个值,我这里设置为10,也可以设置为其它的,一般在5-20都可以,然后将offset改变,每次增加limit的值个,就可以连续请求,直到最后没有数据才会停止了。这就是api属性的由来。

Nyq2UH.png

4. 定义类的方法

def get_data(self): #通过ajax请求得到json数据

rsp = requests.get(self.api, headers=self.headers)

print(rsp.status_code)

self.data = json.loads(rsp.content)[‘data’]

for i in self.data:

id = i[‘id’]

author = i[‘author’][‘name’]

updated_time = time.localtime(i[‘updated_time’])

updated_time = time.strftime(“%Y-%m-%d %H:%M:%S”, updated_time)

voteup_count = i[‘voteup_count’]

comment_count = i[‘comment_count’]

content = i[‘content’]

content = re.sub(‘

link = self.url+’/answer/’+str(id)

self.items.append([id, author, updated_time, voteup_count, comment_count, content, link])

self.console_items.append([id, author, updated_time, voteup_count, comment_count, content, link])

def write_csv(self):

with open(‘data.csv’, ‘w’, encoding=’utf-8-sig’) as csvfile:

writer = csv.writer(csvfile)

for item in self.items:

writer.writerow(item)

def console_print(self):

for i in self.console_items:

print(i)

我们这个爬虫类不能空有一身属性,还得有技能(类的方法)才行对吧,那我就从上到下一个给它定义了四项技能,分别是。

获取数据,即通过requests请求 址来获取数据。

整理数据,获取的数据那么繁杂,我们只需要其中的部分数据,所以交给这个函数来处理

写入数据,数据整理好后我们可以将其写入csv文件(可直接用Excel打开)

显示数据,不论是在代码写好前还是在爬取时,我们都需要关注我们到底爬取了哪些内容,因此我们把相关的结果打印出来,方便我们查漏补缺。

至此类的属性和方法我们全都定义完毕,现在就很好办了,因为构造函数里已经调用了类的全部方法,所以我们只需要将类实例化即可执行我们的Python代码了。

5. 标明程序入点,将类实例化开始执行代码

if __name__ == ‘__main__’:

offset = 0

while True:

spider = ContentSpider(offset)

if not len(spider.data):

print(‘爬取完毕!’)

break

offset += 10

这样,我们的程序就写完啦!

总结

我们可以看出来,用面向对象的思想写代码思路将是如此简单轻松,即使 站变更了我们也可以很容的找出需要修改的地方,这次没有用多线程是因为经过我的实际测试,多线程爬取速度过快触发反爬机制而被禁掉,当然如果你非要多线程的话就需要用代(过滤)理IP了,那就是把简单问题搞复杂了,因为每个问题本来也就没多少数据,1000条8秒就可以搞定,就算是10000个回答你也就等一分多钟而已,况且这种回答数很高的问题很少,所以没必要,我们这里只需要用单线程就可以了,也不会占用别人的服务器的资源。

欢迎大家一起来交流讨论!

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树进阶任务Python问答214465 人正在系统学习中 相关资源:易语言-易语言实现文章秒收软件-其它代码类资源-CSDN文库

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月25日
下一篇 2020年10月25日

相关推荐