# -*- coding:utf-8 -*-import reimport urllibimport urllib.requestimport gzipimport http.cookiejarimport ioimport sys# gb18030sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')class QSBK:global s# 初始化方法,定于一些变量def __init__(self):self.pageIndex = 1# 模拟浏览器self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'# 把模拟的信息保存到请求头中self.headers = {'User-Agent': self.user_agent}# 存放段子的变量,每个元素是每一页的段子们self.stories = []# 存放程序是否继续运行的变量self.enable = False# 传入某一页的索引获得页面代码def getPage(self, pageIndex):try:url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)# 构建request请求request = urllib.request.Request(url, headers=self.headers)# 利用urlopen获取页面代码response = urllib.request.urlopen(request)# 将页面转换为utf-8pageCode = response.read().decode('utf-8')return pageCodeexcept Exception as e:print('连接糗事百科失败,错误原因:' + e)return None# 传入某一页代码,返回本页不带图片的段子列表def getPageItems(self, pageIndex):pageCode = self.getPage(pageIndex)if not pageCode:print('页面加载失败。。。')return NonestrRex = ('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?<div class="articleGender.*?">(.*?)</div>' +'.*?<div class="content">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>')pattern = re.compile(strRex, re.S)items = re.findall(pattern, pageCode)# 用来存储每页的段子们pageStories = []# 遍历正则表达式匹配的信息for item in items:# 是否含有图片haveImg = re.search("img", item[3])# 如果不含有图片,把它加入listif not haveImg:replaceBR = re.compile('<br/>')text = re.sub(replaceBR, "\n", item[1])pageStories.append([item[0].strip(), text.strip(), item[2].strip(), item[4].strip()])return pageStories# 加载并提取页面的内容,加入到列表中def loadPage(self):# 如果当前未看到的页数少于2页,则加载新一页if self.enable is True:if len(self.stories) < 2:# 获取新一页pageStories = self.getPageItems(self.pageIndex)# 将该页的段子存放到全局list中if pageStories:self.stories.append(pageStories)# 获取完之后页码索引加一,表示下次读取下一页self.pageIndex += 1# 调用该方法,每次敲回车打印输出一个段子def getOneStory(self, pageStories, page):# 遍历一页的段子for story in pageStories:# 等待用户输入input1 = input()# 每当输入回车一次,判断一下是否要加载新页面self.loadPage()# 如果输入Q则程序结束if input1 == "Q":self.enable = Falsereturnprint("第%d页\t 发布人:%s\t 年龄:%s\t 赞:%s\n%s" % (page, story[0], story[1], story[3], story[2]))# 开始方法def start(self):print("正在读取糗事百科,按回车查看新段子,Q退出")# 使用变量为True,程序可以正常运行self.enable = True# 先加载一页内容self.loadPage()# 局部变量,控制当前读到了第几页nowPage = 0while self.enable:if len(self.stories) > 0:# 从全局list中获取一页的段子pageStories = self.stories[0]# 当前读到的页数加一nowPage += 1# 将全局list中第一个元素删除,因为已经取出del self.stories[0]# 输出该页的段子self.getOneStory(pageStories, nowPage)# 保存def saveFile(data):data = data.encode('utf-8')save_path = 'J:\\Python\\Demo\\temp.out'f_obj = open(save_path, 'wb') # wb表示打开方式f_obj.write(data)f_obj.close()# 请求头值header = {'Connection': 'Keep-alive','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6','Accept-Encoding': 'gzip,deflate','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36','Host': 'www.qiushibaike.com'}spider = QSBK()strpage = spider.start()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。