# -*- coding:utf- -*-
import urllib
import urllib2
import re
import thread
import time #糗事百科爬虫类
class QSBK:
#初始化方法,定义一些变量
def __init__(self):
self.pageIndex =
self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
#初始化headers
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 = urllib2.Request(url,headers = self.headers)
#利用urlopen获取页面代码
response = urllib2.urlopen(request)
#将页面转化为UTF-8编码
pageCode = response.read().decode('utf-8')
return pageCode except urllib2.URLError, e:
if hasattr(e,"reason"):
print u"连接糗事百科失败,错误原因",e.reason
return None #传入某一页代码,返回本页不带图片的段子列表
def getPageItems(self,pageIndex):
pageCode = self.getPage(pageIndex)
if not pageCode:
print "页面加载失败...."
return None
pattern = re.compile('<div.*?author.*?>.*?<a.*?<img.*?</a>.*?<a.*?<h2>(.*?)</h2>.*?</div>.*?<div.*?' +
'content">(.*?)</div>', re.S)
items = re.findall(pattern,pageCode)
#用来存储每页的段子们
pageStories = []
#遍历正则表达式匹配的信息
for item in items:
#是否含有图片
haveImg = re.search("img",item[])
#如果不含有图片,把它加入list中
if not haveImg:
replaceBR = re.compile('<br/>')
text = re.sub(replaceBR,"\n",item[])
#item[]是一个段子的发布者,item[]是内容,item[]是发布时间,item[]是点赞数
pageStories.append([item[].strip(),text.strip()])
return pageStories #加载并提取页面的内容,加入到列表中
def loadPage(self):
#如果当前未看的页数少于2页,则加载新一页
if self.enable == True:
if len(self.stories) < :
#获取新一页
pageStories = self.getPageItems(self.pageIndex)
#将该页的段子存放到全局list中
if pageStories:
self.stories.append(pageStories)
#获取完之后页码索引加一,表示下次读取下一页
self.pageIndex += #调用该方法,每次敲回车打印输出一个段子
def getOneStory(self,pageStories,page):
#遍历一页的段子
for story in pageStories:
#等待用户输入
input = raw_input()
#每当输入回车一次,判断一下是否要加载新页面
self.loadPage()
#如果输入Q则程序结束
if input == "Q":
self.enable = False
return
print u"第%d页\t发布人:%s\t内容:%s" %(page,story[],story[]) #开始方法
def start(self):
print u"正在读取糗事百科,按回车查看新段子,Q退出"
#使变量为True,程序可以正常运行
self.enable = True
#先加载一页内容
self.loadPage()
#局部变量,控制当前读到了第几页
nowPage =
while self.enable:
if len(self.stories)>:
#从全局list中获取一页的段子
pageStories = self.stories[]
#当前读到的页数加一
nowPage +=
#将全局list中第一个元素删除,因为已经取出
del self.stories[]
#输出该页的段子
self.getOneStory(pageStories,nowPage) spider = QSBK()
spider.start()

最新文章

  1. [Unity3D]UI界面之瞄准镜设置说明
  2. 【树莓派】 Failed to fetch http://mirrordirector.raspbian.org/raspbian/pool/main/c/chkconfig/chkconfig_11.4.54.60.1debian1_all.deb Could not resolve &#39;mirrordirector.raspbian.org&#39;
  3. 解决&quot;415 Cannot process the message because the content type &#39;application/x-www-form-urlencoded&#39; was not the expected type &#39;text/xml; charset=utf-8&#39;&quot;
  4. 【转】ASP.NET ViewState详解
  5. memcached应用场景(转)
  6. Spinner学习
  7. 【狼窝乀野狼】Excel那些事儿
  8. iOS中ASI和AFN的区别
  9. [资源分享]神州数码 思科 UCS 虚拟化培训资料
  10. git 更换远程仓库地址
  11. CentOS下利用sshpass不用手动输入密码远程执行命令
  12. sqlserver 存储过程学习笔记(二) 在项目中的应用&lt;多表分页&gt;
  13. POJ 3449 Geometric Shapes
  14. iOS安全攻防之使用 Frida 绕过越狱设备检测
  15. angular2 学习笔记 ( Dynamic Component 动态组件)
  16. DataPipeline在大数据平台的数据流实践
  17. Python之路【第一篇】Linux常见命令语句
  18. numpy中的广播机制
  19. Failed while changing version of Java to 1.8.
  20. 带报表的asp.net项目不要升级

热门文章

  1. pptp协议的工作原理
  2. BZOJ4472 JSOI2015salesman(树形dp)
  3. 51nod 1779逆序对统计(状压DP)
  4. 使用JavaScript时要注意的7个要素
  5. Expect使用小记
  6. SCOI2010 传送带 [三分/模拟退火]
  7. [bzoj 2733]启发式合并权值线段树
  8. [fzu 2273]判断两个三角形的位置关系
  9. maven 压缩、合并 js, css
  10. [06] JavaScript 类型