• Python爬虫Scrapy测试


    # -*- coding:utf-8 -*-
    import urllib
    import urllib2
    import re
    import thread
    import time
    
    #糗事百科爬虫类
    class QSBK:
        #初始化方法,定义一些变量
        def __init__(self):
            self.pageIndex = 1
            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[1])
                #如果不含有图片,把它加入list中
                if not haveImg:
                    replaceBR = re.compile('<br/>')
                    text = re.sub(replaceBR,"
    ",item[1])
                    #item[0]是一个段子的发布者,item[1]是内容,item[2]是发布时间,item[4]是点赞数
                    pageStories.append([item[0].strip(),text.strip()])
            return pageStories
    
    
        #加载并提取页面的内容,加入到列表中
        def loadPage(self):
            #如果当前未看的页数少于2页,则加载新一页
            if self.enable == 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:
                #等待用户输入
                input = raw_input()
                #每当输入回车一次,判断一下是否要加载新页面
                self.loadPage()
                #如果输入Q则程序结束
                if input == "Q":
                    self.enable = False
                    return
                print u"第%d页	发布人:%s	内容:%s" %(page,story[0],story[1])
        
        #开始方法
        def start(self):
            print u"正在读取糗事百科,按回车查看新段子,Q退出"
            #使变量为True,程序可以正常运行
            self.enable = True
            #先加载一页内容
            self.loadPage()
            #局部变量,控制当前读到了第几页
            nowPage = 0
            while self.enable:
                if len(self.stories)>0:
                    #从全局list中获取一页的段子
                    pageStories = self.stories[0]
                    #当前读到的页数加一
                    nowPage += 1
                    #将全局list中第一个元素删除,因为已经取出
                    del self.stories[0]
                    #输出该页的段子
                    self.getOneStory(pageStories,nowPage)
    
    
    spider = QSBK()
    spider.start()
  • 相关阅读:
    Codeforces Round #271 (Div. 2) F. Ant colony 线段树
    poj 1744 tree 树分治
    HDU Shell Necklace CDQ分治+FFT
    BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
    BZOJ 1042: [HAOI2008]硬币购物 容斥+背包
    HDU 6078 Wavel Sequence 树状数组优化DP
    Gym
    HDU 6058 Kanade's sum 二分,链表
    HDU 6061 RXD and functions NTT
    ZOJ 3233 Lucky Number 容斥原理
  • 原文地址:https://www.cnblogs.com/wuxl360/p/5570246.html
Copyright © 2020-2023  润新知