参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码:

#coding=utf-8
#!/usr/bin/python
import urllib
import urllib2
import re
import thread
import time
import sys

#定义要抓取的网页
#url = 'http://www.qiushibaike.com/hot/'
#读取要抓取的网页
#globalcontent = urllib.urlopen(url).read()
#抓取段子内容
#new_inner01_h = globalcontent.find('<div class="content" <span>')
#print new_inner01_h
#设置系统编码utf-8
reload(sys)
sys.setdefaultencoding("utf-8")

#加载处理糗事百科
class Spider_Model:
"""docstring for Spider_Model"""
def __init__(self):
self.page = 1
self.pages = []
self.enable = False

#抓取该页面的所有段子,添加到列表中并且返回列表
def GetPage(self,page):
try:
myUrl = "http://m.qiushibaike.com/hot/page/" + str(page)
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
headers = {'User-Agent':user_agent}
req = urllib2.Request(myUrl,headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read().decode('utf-8')
return myPage
#decode的作用将其他编码的字符串转换成Unicode编码

except urllib2.URLError, e:
if hasattr(e,"code"):
print u"链接糗事百科失败,错误原因",e.code
if hasattr(e,"reason"):
print u"链接糗事百科失败,错误原因",e.reason
return None

#传入某一页代码,返回本页不带图片的段子列表
def getPageItems(self,page):
myPage = self.GetPage(page)
if not myPage:
print "页面加载失败..."
return None
#正则匹配需要获取的段子
pattern = re.compile('<div.*?class="author.*?clearfix".*?>.*?<a.*?</a>.*?<a.*? title="(.*?)">.*?</a>.*?<div.*?class'+
'="content".*?>.*?<span.*?>(.*?)</span>.*?</a>(.*?)<div.*?class="stats.*?>.*?<i.*?class="number">(.*?)</i>',re.S)
# pattern = re.compile('.*?(.*?)(.*?).*?.*?(.*?).*?.*?.*?(.*?).*?.*?',re.S)
#pattern = re.compile('(.*?)(.*?).*?', re.S)
#pattern = re.compile(r'.*?<a.*?<a.*?(.*?).*?(.*?)<!.*?.*?(.*?)',re.S)
items = re.findall(pattern,myPage)

#用来存储每页的段子们
pageStroies = []
#遍历正则表达式匹配的信息
for item in items:
#判断是否包含图片
haveImg = re.search("img",item[2])

#如果不含有图片,把它加入list中
if not haveImg:
#item[0]是发布者,item[1]是内容,item[3]是点赞数

if '<br/>' in item:
new_item = re.sub(r'<br.*?>','\n',item)
pageStroies.append([new_item[0].strip(),new_item[1].strip(),new_item[3].strip()])
else:
pageStroies.append([item[0].strip(),item[1].strip(),item[3].strip()])
return pageStroies

#找出所有class="content"的div标记
#re.S是任意匹配模式,也就是.可以匹配换行符
#myItems = re.find('<div.*?class="content">(.*?)</div>',unicodePage,re.S)
#items = []
#for item in myItems:
#item[0]是div的标题
#item[1]是div的内容
#items.append([item[0].replace("\n",""),item[1].replace("\n"),""])
#items = item[0]
#return items

#加载并提取页面的内容,加入到列表中
def LoadPage(self):
#如果用户未输入quit则一直运行
#while self.enable:
if self.enable == True:
#如果当前未看的页数小于2也,则加载新一页
if len(self.pages) < 2:
#获取新一页
pageStroies = self.getPageItems(self.page)
#将该页的段子存放到全局list中
if pageStroies:
self.pages.append(pageStroies)
#获取完之后页面索引加一,表示下次读取下一页
self.page += 1
#try:
# 获取新的页面中的段子
#myPage = self.GetPage(str(self.page))
#self.page += 1
#self.pages.append(myPage)
#except:
#print '无法链接糗事百科'
#else:
#time.sleep(1)
#调用该方法,每次敲回车打印输出一个段子
def ShowPage(self,pageStroies,page):
#遍历一页的段子
for items in pageStroies:
#等待用户输入
input = raw_input()
#每次输入回车,判断是否要加载新页面
self.LoadPage()

#输入输入Q则程序结束
if input == "Q":
self.enable = False
return
print u"第%d页\n发布人:%s\t\n发布内容:%s\n赞:%s\n" %(page,items[0],items[1],items[2])

def Start(self):
print u"正在读取糗事百科,按回车见查看新段子,Q退出"
#初始化变量为True,程序正常执行
self.enable = True
#先加载一页内容
self.LoadPage()
#局部变量,控制当前读到了第几页
nowPage = 0
while self.enable:
if len(self.pages)>0:
#从全局list中获取一页的段子
pageStroies = self.pages[0]
#当前读到的页数加一
nowPage += 1
#将全局list中第一个元素删除,因为已经取出
del self.pages[0]
#输出该页的段子
self.ShowPage(pageStroies,nowPage)
'''
page = self.page

#新建一个线程在后台加载段子存储
thread.start_new_thread(self.LoadPage,())

#加载处理糗事百科
while self.enable:
#如果self的page数组中存有元素
if self.pages:
nowPage = self.pages[0]
del self.pages[0]
self.ShowPage(nowPage,page)
page += 1

print u'请按下回车键浏览今日的糗事百科:'
raw_input(' ')
'''
myModel = Spider_Model()
myModel.Start()

Python爬虫爬取糗事百科段子内容的更多相关文章

  1. Python爬虫-爬取糗事百科段子

    闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...

  2. python学习(十六)写爬虫爬取糗事百科段子

    原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...

  3. Python爬虫--抓取糗事百科段子

    今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该 ...

  4. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  5. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

  6. 8.Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  7. [爬虫]用python的requests模块爬取糗事百科段子

    虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更 ...

  8. python爬取糗事百科段子

    初步爬取糗事百科第一页段子(发布人,发布内容,好笑数和评论数) #-*-coding:utf--*- import urllib import urllib2 import re page = url ...

  9. 芝麻HTTP:Python爬虫实战之爬取糗事百科段子

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

随机推荐

  1. 非常详细的/etc/passwd解释

    root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nol ...

  2. 将一个Asp.Net网站改为MVC

    背景:   网站已经开发的一部分 主要是Web服务和API  现在要做一些给人看的页面 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/add-mvc-in-w ...

  3. bzoj3212 pku3468 A Simple Problem with Integers

    一个有初值的数列.区间加.区间查 用线段树直接水过 然而并没有1A,主要是做题太快没看规模结果没注意线段树要用longlong建 卧槽怎么可以这么坑爹,害得我看见wa心慌了,还以为连线段树都要跪 一开 ...

  4. db2look和db2move详解

    db2look和db2move简单实例 --- 建库create database db_name on filesystem_location using codeset utf-8 territo ...

  5. ZeroMQ接口函数之 :zmq_ctx_get - 得到环境上下文的属性

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_get zmq_ctx_get(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq_c ...

  6. 李洪强iOS经典面试题139-Swift

    李洪强iOS经典面试题139-Swift Swift 网上有很多Swift的语法题,但是Swift现在语法还未稳定,所以在这里暂时不贴出语法题,可以自行搜索. Swift和Objective-C的联系 ...

  7. 大数据技术Hadoop入门理论系列之一----hadoop生态圈介绍

    Technorati 标记: hadoop,生态圈,ecosystem,yarn,spark,入门 1. hadoop 生态概况 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用 ...

  8. PHP的流程控制结构

    1.break 使用break语句可以将深埋在嵌套循环中的语句退出到指定层数或直接退出到最外层,break是接受一个可选的数字参数来决定跳出几重语句.break可以跳出几重语句.break可以跳出几重 ...

  9. Linux Vim编辑器使用简单讲解

    在Linux中,主要编辑器为vi或者vim,本文围绕vim做简单的讲解说明:Linux默认自带vi(vim)编辑器,其程序包为:[root@linuxidc.com ~]# rpm -qf `whic ...

  10. Unity运行时检测Altas使用情况

    UI贴图在游戏中内存大小中占的分量非常非常大,尤其对于前期对UI没有规划的项目,无论是包量还是内存大小都是需要花费很多时间去优化.如果涉及到战斗场景和逻辑场景的情况下,常用的做法就是把两个场景使用的a ...