嗨~鱼来了
最近工作比较忙,和朋友聊天时发现我的段子库存已经严重不足,需要扩充了。知乎上有很多适合茶余饭后看的小段子,蛮有意思的。小鱼就脆带大家来写个小爬虫,把他们都爬下来。
非常适合新手实操,白白们赶快操作起来吧!
一、开发工具:Python3.6.4
使用到的模块:
Request模块;
Pyqt5模块;以及一些python自带的模块。
环境搭建:安装Python并添加到环境变量,pip安装需要的相关模块即可。
二、原理简介
我举一个例子:
首先,在知乎上搜索一个关于搞笑段子的问答
https://www.zhihu.com/question/341002197
类似于这种:
之前的文章里说过,获取知乎的回答只需要请求这个接口就行了:
https://www.zhihu.com/node/QuestionAnswerListV2
需要携带的参数也不复杂:
data = {
'method':'next',
'params': '{"url_token":%s,"page_size":%s,"offset":%s}' % (question_id, size, offset)
}
三、脚本
所以我们很快就可以完成一个数据爬取的小脚本了(这是最最最基础的爬虫代码,所以我就不一点点地去讲解啦):
'''知乎段子'''
class zhihuJokesSpider():
def __init__(self, question_id, **kwargs):
self.question_id = question_id
self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'Accept-Encoding': 'gzip, deflate'
}
self.api_url = 'https://www.zhihu.com/node/QuestionAnswerListV2'
self.session = requests.Session()
self.pointer = 0
self.limits = 2000
'''开始运行'''
def start(self):
offset = -1
size = 1
jokes = []
while self.pointer <= self.limits:
offset += size
data = {
'method': 'next', 'params': '{"url_token":%s,"page_size":%s,"offset":%s}' % (self.question_id, size, offset) }
response = self.session.post(self.api_url, headers=self.headers, data=data) joke = eval(response.text)['msg'][0].replace('\\', '')
joke = re.findall(r'(.*?)
', joke)
joke_filtered = [] for item in joke: if '
' in item: item = item.replace('
', '') if '' in item: item = item.replace('', '') if '' in item: item = item.replace('', '') if len(item) < 5: continue
if 'www.zhihu.com' in item: continue
joke_filtered.append(item)
joke = '\n'.join(joke_filtered)
print(joke)
jokes.append(joke)
time.sleep(random.randint(0, 1) + random.random())
self.pointer += 1
if not os.path.exists(str(self.question_id)):
os.mkdir(str(self.question_id))
with open(os.path.join(str(self.question_id), 'jokes.pkl'), 'wb') as fp: pickle.dump(jokes, fp)
调用并运行他就ok啦:
question_id = '341002197'
client = zhihuJokesSpider(question_id)
client.start()
四、编写GUI
接着,我们用PyQt5搞个简单的笑话浏览用的GUI(代码如下):
'''demo'''
class JokeDemo(QWidget):
def __init__(self, parent=None, **kwargs):
super(JokeDemo, self).__init__(parent)
self.all_jokes = self.load()
# 定义组件
self.setWindowTitle('随机浏览段子 - 小鱼Python') self.setWindowIcon(QIcon('data/icon.jpg'))
self.setFixedSize(600, 400)
self.label_result = QLabel('随机段子:')
self.button_generate = QPushButton('随机读取一个段子')
self.text_result = QTextEdit()
# 布局
self.grid = QGridLayout()
self.grid.addWidget(self.label_result, 0, 0, 1, 1) self.grid.addWidget(self.button_generate, 0, 9, 1, 1) self.grid.addWidget(self.text_result, 1, 0, 1, 10)
self.setLayout(self.grid)
# 事件绑定
self.button_generate.clicked.connect(self.generate)
'''随机读取一个段子'''
def generate(self):
self.text_result.setText(random.choice(self.all_jokes))
'''导入所有段子'''
def load(self):
root_dir = 'data'
all_jokes = []
for item in os.listdir(root_dir):
if not item.endswith('.pkl'): continue
with open(os.path.join(root_dir, item), 'rb') as fp:
joke = pickle.load(fp)
all_jokes += joke
return all_jokes
大功告成,完整源代码可私聊~
————————————————
为了让学习Python的小白们更好的交流和提问,鱼建立了一个交流群:954526228(注意进群暗号是:小鱼)
文中提到的书籍在群里都可以免费获得哦~还有超多内部资料免费发放!
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)