spider for qsbk

突然发现,这个世界果然还是技术人员的世界

关于糗事百科的一个爬虫,模仿他人代码而成,对于初步接触正则表达式,理解python面向对象编程该是很有帮助的,但是自我感觉最有意思的是,解决不知名问题的成功后的快感。

下面可以说是最折腾我的一个问题,所以只记录了他。
回头想想,说到底还是没有重视错误提示的原因。

错误版本:
# -- coding:utf-8 --

import urllib2
import re


class BaikeSpider:
    def __init__(self):
        self.pageIndex = 1
        self.user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0'
        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)
            response = urllib2.urlopen(request)
            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
        expression = \
            '<div class="author clearfix">.*?<img.*?" alt="(.*?)"/>.*?' \
            '<div class="content">(.*?)</div>.*?<span class="stats-vote">' \
            '<i class="number">(.*?)</i>.*?<a href.*?<i class="number">(.*?)' \
            '</i>.*?</a>'
        pattern = re.compile(expression, re.S)
        items = re.findall(pattern, pageCode)
        pageStories = []
        for item in items:
            replaceBR = re.compile('<br/>')
            text = re.sub(replaceBR, '\n', items[1])
            #0是发布人,1是内容,2是点赞数,3是评论数
            pageStories.append([item[0].strip(), text.strip(), item[2].strip(), item[3].strip()])
        return pageStories

    def loadPage(self):
        if self.enable == True:
            if len(self.stories) < 2:
                pageStories = self.getPageItems(self.pageIndex)
                if pageStories:
                    self.stories.append(pageStories)
                    self.pageIndex += 1

    def getOneStory(self, pageStories, page):
        for story in pageStories:
            inputs = raw_input()
            self.loadPage()
            if inputs == "Q":
                self.enable = False
                return
            print u"第%d页\t发布人:%s\n段子:%s\n赞:%s\n评论:%s" % (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
                del self.stories[0]
                self.getOneStory(pageStories, nowPage)

spider = BaikeSpider()
print spider.start()

报错:
G:\python27\python.exe D:/编程/PY/test_new.py
正在读取糗事百科,按回车查看新段子,Q退出

(由于路径是中文,路径编码问题就不用管了,暂时没有影响)

Traceback (most recent call last):
  File "D:/���/PY/test_new.py", line 76, in <module>
    print spider.start()
 File "D:/���/PY/test_new.py", line 66, in start
    self.loadPage()
  File "D:/���/PY/test_new.py", line 49, in loadPage
    pageStories = self.getPageItems(self.pageIndex)
  File "D:/���/PY/test_new.py", line 41, in getPageItems
    text = re.sub(replaceBR, '\n', items[1])
  File "G:\python27\lib\re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or buffer

Process finished with exit code 1

错误里很明确的表示出错误所在:

spider.start()->self.loadPage()->pageStories = self.getPageItems(self.pageIndex)-> text = re.sub(replaceBR, '\n', items[1])

以上表明了当前文件里的错误位置,应该是在sub()这里。仔细检查对应区域,可以发现,原来是第三个参数写错了。。。
应该是item[1]
结果此下:

G:\python27\python.exe D:/编程/PY/test_new.py
正在读取糗事百科,按回车查看新段子,Q退出

第1页 发布人:爱生活爱扯淡
段子:等了两个月的抽油烟机维修员今天终于来了,然后对着图纸絮絮叨叨地摆弄了半个多小时,。火花一闪,一缕黑烟,成功地烧毁了主板,并且停了我家的电。
赞:3788
评论:85
Q

Process finished with exit code 0

面临的问题:
1. 随着网站的改版升级,代码可能会失效。
大多数是因为,正则表达式规则不再适用于新的代码,因为迟迟不能出现结果。
对于此类,最直接的方法就是,重看网页源代码(用浏览器很方便),相应更改就好。
2. 现在的匹配速度感觉一般。
暂时不了解怎样的表达式执行效率更高,还有待学习与加强。
3. 代码的内容还是可以有删减的。
随着目的的不同,可以适当的提取使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值