这几天看了不少phtyon 的基础,试着做了一个daemo
但不是很成功 不知道家里网络不太好还正则匹配的不好,re.findall 的数据不是特别的稳定,有时候要加载很长间,本来是计划用列表做有个缓存功能存2页,但最后还是没实现。这个还有很BUG 有兴趣的同学可看下

#!/bin/env python
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import thread
import time
#糗事百科爬虫类
pageStories = []
class QSBK:
    def __init__(self):
        self.pageIndex = 3
        self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        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 = 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.*?class="author.*?>.*?<a.*?</a>.*?<h2>(.*?)</h2>.*?<div.*?class'+
                              '="content".*?<span>(.*?)/span>.*?<i.*?class="number">(.*?)</i>.*?<i.*?>(.*?)</i>.*?<div.*?class.*?"main-text">(.*?)<div',
                              re.S)
         try:
             items= re.findall(pattern,pageCode)
         except IOError, e:
              print 'could not open file:', e
         #用来存储每页的段子们
         #遍历正则表达式匹配的信息
         for item in items:
             #haveImg = re.search("img",item[3])
             #如果不含有图片,把它加入list中
            # if not haveImg:
         #item[0]是一个段子的发布者,item[1]是发布时间,item[2]是内容,item[4]是点赞数
                  pageStories.append([item[0].strip(),item[1].strip(),item[2].strip(),item[4].strip()])
         return pageStories
                #加载并提取页面的内容,加入到列表中
    def loadPage(self):
 #如果当前未看的页数少于2页,则加载新一页
         if self.enable == True:
            if len(self.stories) < 1:
                pageStories = self.getPageItems(self.pageIndex)
                if pageStories:
                    self.stories.append(pageStories)
                    self.pageIndex +=1
    def getOneStory(self,pageStories,page):
           for story in pageStories:
               input = raw_input()
               self.loadPage()
               if input == "Q":
                   self.enable = False
                   return
               print u"第%d页\t" u"作者:%s\n%s\n赞:%s\n神评论%s\n" %(page,story[0],story[1],story[2],story[3])


    def start(self):
         print u"正在读取糗事百科,按回车查看新段子,Q退出"
         self.enable = True
         self.loadPage()
         #局部变量,控制当前读到了第几页
         nowPage = 0

         while self.enable:
             if len(self.stories)>0:
                 pageStories = self.stories[0]
                 nowPage += 1
                 #将全局list中第一个元素删除,因为已经取出\
                 del self.stories[0]
                 self.getOneStory(pageStories,nowPage)
             else:self.loadPage()


spider = QSBK()
spider.start()
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐