设为首页 收藏本站
查看: 646|回复: 0

[经验分享] #python爬虫:爬取糗事百科段子

[复制链接]

尚未签到

发表于 2015-12-2 09:43:30 | 显示全部楼层 |阅读模式
#出处:http://python.jobbole.com/81351/
#确定url并抓取页面代码,url自己写一个
import urllib,urllib2
def getUrl():
    page=1
    url="http://www.qiushibaike.com/hot/page/"+str(page)
    try:
        request=urllib2.Request(url)
        response=urllib2.urlopen(request)
        print response.read()
    except urllib2.URLError,e:
        if hasattr(e,'code'):
            print e.code
        if hasattr(e,'reason'):
            print e.reason
#getUrl()#运行错误
def getUrl():
    page=1
    url="http://www.qiushibaike.com/hot/page/"+str(page)
    user_age='Mozilla/4.0(compatible;MSIE5.5;Windows NT)'
    headres={'User-Agent':user_age}
    try:
        request=urllib2.Request(url,headers=headres)
        response=urllib2.urlopen(request)
        print response.read()
    except urllib2.URLError,e:
        if hasattr(e,'code'):
            print e.code
        if hasattr(e,'reason'):
            print e.reason#这样打印出页面的源代码
#提取某一页的所有段子
#要求:获取发布人,发布日期,段子内容,点赞的个数,但是有些段子是带图片,在控制台不能显示图片,所以需要把带有图片的段子给删除掉,只保存仅文本段子
#目的通过正则匹配来寻找所有要求的内容,方法如下
import re
def getUrl1():
    page=1
    url="http://www.qiushibaike.com/hot/page/"+str(page)
    user_age='Mozilla/4.0(compatible;MSIE5.5;Windows NT)'
    headres={'User-Agent':user_age}
    try:
        request=urllib2.Request(url,headers=headres)
        response=urllib2.urlopen(request)
        content=response.read().decode('utf-8')
        pattern=re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class'+
                         '="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
        items=re.findall(pattern,content)
        for i in items:
            haveImg=re.search('img',i[3])
            if not haveImg:
                print i[0],i[1],i[2],i[4]
    except urllib2.URLError,e:
        if hasattr(e,'code'):
            print e.code
        if hasattr(e,'reason'):
            print e.reason
#利用面向对象模式编程
import urllib,urllib2,re,thread,time
class QSBK:
    def __init__(self):
        self.pageIndex=1
        self.user_agent="Mozilla/4.0(compatible;MSIE5.5;Windows NT)"
        self.headres={'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=urllib2.Request(url,headers=self.headres)#构建请求
            response=urllib2.urlopen(request)#利用urlopen获取页面代码
            pageCode=response.read().decode('utf-8')#编码为utf-8
            return pageCode
        except urllib2.URLError as e:
            if hasattr(e,'reason'):
                print u'连接失败:{0}'.format(e.reason)
                return None
    #传入某一页代码,返回本页不带图片的段子列表
    def getPageItems(self,index):
        pageCode=self.getPage(index)
        if not pageCode:
            print u'加载页面失败.....'
            return None
        pattern=re.compile('<div.*?class="author.*?>.*?<a.*?</a>.*?<a.*?>(.*?)</a>.*?<div.*?class'+
                         '="content".*?title="(.*?)">(.*?)</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
        items=re.findall(pattern,pageCode)
        #用来存储每页段子们
        pageStories=[]
        #遍历正则表达式匹配信息
        for i in items:
            #是否含有图片
            haveImg=re.search('img',i[3])
            if not haveImg:#如果不含有图片,把它加入到列表中
                #i[0]是一个段子的发布者,i[1]发布时间,i[2]内容,i[4]点赞数
                pageStories.append([i[0].strip(),i[1].strip(),i[2].strip(),i[4].strip()])
        return  pageStories
    #加载并提取页面内容,加入到列表中
    def loadPage(self):#如果当前来看的页面小于2页,则加载新一页
        if self.enable==True:
            if len(self.stories)<2:#获取新一页
                pageS=self.getPageItems(self.pageIndex)
                if pageS:
                    #将该页面的段子放到全局列表中
                    self.stories.append(pageS)
                    self.pageIndex+=1#获取完之后页面索引加1,表示下次读取下一页
    #调用该方法,每次敲回车打印输出一个段子
    def getOneStory(self,page1,page):
        for story in page1:#遍历一页
            _input=raw_input()#等待用户输入
            self.loadPage()#每当输入回车一次,判断一下是否要加载新页面
            if _input=='Q':#如果输入为Q则结束
                self.enable=False
                return
            print u'第{0}页\t发布人:{1}\t发布时间:{2}\n{3}赞:{4}\n'.format(page,story[0],story[1],story[2],story[3])
    #开始
    def start(self):
        print u'正在读取信息,按回车查看新段子,Q退出>>>'
        self.enable=True#变量为真,程序可以正常运行
        self.loadPage()#先加载一页内容
        howpage=0#局部变量,控制当前讲到了第几页
        print 11
        while self.enable:
            if len(self.stories)>0:
                pageStories=self.stories[0]#从全局列表中获取一页段子
                howpage+=1#当前读到页面加1
                del self.stories[0]#传全局列表中第一个元素删除,因为已经取出
                self.getOneStory(pageStories,howpage)#输出
spider=QSBK()
spider.start()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146173-1-1.html 上篇帖子: Python 对象的引用计数和拷贝 下篇帖子: Linux搭建python环境中cx_Oracle模块安装遇到的问题与解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表