Python3.x:抓取百事糗科段子

Python3.x:抓取百事糗科段子

实现代码:

 1 #Python3.6 获取糗事百科的段子
 2 import urllib.request       #导入各类要用到的包
 3 import urllib
 4 import re
 5 
 6 #用正则表达式爬取糗事百科的段子,并实现去除带有的图片段子,且每按一次回车键实现显示下一条段子
 7 #写这程序的原理是先把网页爬下来,再解析匹配源代码中的段子,并把所有的带图片和不带图片的段子都进行保存
 8 #再在输出段子时实现控制输出就能实现只输出不带图片的段子,并实现每按一次快捷键就显示下一个段子的内容
 9 #就是好像每一页都有二十个段子的。。。。只爬下来十九。。。。
10 
11 
12 class QSBK():
13     def __init__(self):
14         self.url='http://www.qiushibaike.com/hot/page/'                 #基础网址
15         self.user_agent='Mozilla/4.0(cpmpatible;MSIE 5.5;Windows NT)'   #要添加的headers
16         self.headers={'User-Agent':self.user_agent}
17         self.item_joke=[]                                               #用来保存段子的列表
18 
19     #请求函数
20     def request(self,page):
21         request=urllib.request.Request(self.url+str(page),headers=self.headers)
22         response=urllib.request.urlopen(request)
23         return response.read().decode('utf-8')                      #将源代码进行编码转换为HTML格式
24 
25     #将获取到的网页和正则表达式进行匹配并返回匹配到的每个段子的信息列表
26     def get_joke(self,content):
27         try:
28             pattern = re.compile('<.*?class="author.*?>.*?<a.*?<h2>(.*?)</h2>.*?<div.*?class="content".*?<span>(.*?)</span>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
29             self.item_joke.append(re.findall(pattern, content))     #将获取到的每一页的段子追加到存储列表中
30         except urllib.error.URLError as e:
31             if hasattr(e, "code"):
32                 print(e.code)
33             if hasattr(e, "reason"):
34                 print(e.reason)
35 
36     #逻辑函数
37     def logic(self):
38         page=input('输入你想要进行爬取的页数:')
39         for i in range(int(page)):
40             content=self.request(i+1)
41             self.get_joke(content)
42 
43         print('输出段子:')
44         i=0                                         #用来记录无图的段子
45         print('每按一次快捷键读取一条段子,按Q退出!')
46         for items in self.item_joke:                #由于爬取到的数据返回是以列表形式返回一整夜的段子的,所以要用for循环嵌套进行输出
47             for item in items:
48                 input_=input()
49                 if input_=='Q':
50                     return
51                 if not re.search('img',item[2]):    #筛选无图的段子输出
52                     i+=1
53                     print('\n作者:'+str(item[0]),'\n内容:'+str(item[1])+'\n点赞人数:'+str(item[3]))
54         print('\n段子输出完毕!\n段子数量为:',i)
55 
56 qiushibaike=QSBK()
57 qiushibaike.logic()

 

posted @ 2017-12-25 00:18  整合侠  阅读(619)  评论(0编辑  收藏  举报