初学爬虫,爬取糗百段子(修改版,亲测)

这几天在网上看爬虫教程,有一个教程觉得写得很好,研究了一下,感谢作者做出这么好的教程。

原网页地址为:http://blog.csdn.net/column/details/why-bug.html


这个代码也是基于原作者爬虫代码修改而来,原网页地址为:http://blog.csdn.net/pleasecallmewhy/article/details/8932310

在代码中,已注释一些自己的理解,详尽之处请参考原文。


另外,暂时还没学会BS4的用法,也没有爬取图片,这些功能也会慢慢修改,欢迎看到此篇文章的人多交流,共同学习。

#-*- coding:utf-8 -*-

# from bs4 import BeautifulSoup
import urllib2
import re
import time
import thread

#建立一个爬虫的类
class spider:

    def __init__(self):
        #首先确定加载的页数
        self.page = 1
        self.pages = []
        # 后面有循环
        self.loop = False

    # 扣除段子部分的代码
    # 这个部分大部分爬虫都是一样
    def getPage(self,page):
        # 糗事百科地址,这个不要弄错
        # 爬其他东西把地址换一下就可以
        # 这个部分是伪装成浏览器进入糗百的主页
        url = "http://m.qiushibaike.com/hot/page/" + page + '/'
        user_agent = 'Mozilla/4.0(compatible;MSIE 5.5; Windows NT)'
        headers = { 'User-Agent' : user_agent}
        req = urllib2.Request(url,headers = headers)
        myResponse = urllib2.urlopen(req)
        # 抓取页面
        myPage = myResponse.read()
        # 对爬下来的内容进行解码,转换成Unicode编码
        unicodePage = myPage.decode('utf-8')
        # soup = BeautifulSoup(myResponse.read())
        # contents= soup.find_all('div class="content"','/div')
        # 还在学BS4爬东西,暂时没用到
        # 根据网页源代码的特点找出段子的内容
        # 标记为<class="content"></div>
        contents=re.findall('<div.*?class="content".*?>(.*?)</div>',unicodePage,re.S)
        list = []
        # 将段子保存进列表
        for content in contents:
            list.append(content.replace("\n",""))
        return list


    #如果页面中的段子已经扣完,想扣新的段子
    def loadPage(self):
        while self.loop:
            if len(self.pages) < 2 :
                # 当加载的段子条数小于两条的时候,读取第二页第三页内容
                try:
                    # self.getPage返回的是list[],已经是这一页所有的段子
                    myPage = self.getPage(str(self.page))
                    # 这是第二页的第一条
                    self.page += 1
                    self.pages.append(myPage)
                except:
                    print u"无法链接糗事百科"
            else:
                time.sleep(1)


    def showPage(self,nowPage,page):
        # nowPage中只有一个元素,list遍历出来只打印出于nowPage中相同的元素
        for list in nowPage:
            print u'第%d页\n' % page , list , '\n'
            next = raw_input('>next\n')
            if next == "exit":
                self.loop = False
                print u"已退出爬虫程序"
                break


    def start(self):
        self.loop = True
        page = self.page

        print u"程序正在加载中,正在寻找段子,请稍后....\n"

        # 多线程是个坑,可以做很多事情
        thread.start_new_thread(self.loadPage,())

        # 开始加载
        while self.loop:
            # 保证pages中只有不超过两个元素,删除刚才显示的那一条段子
            if self.pages:
                # nowPage内有所有的段子
                nowPage=self.pages[0]
                # 删除第一条,存入下一条
                del self.pages[0]
                self.showPage(nowPage,page)
                page += 1

# 爬虫开始
print u"""
-----------------浏览糗事百科的段子--------------
    按下任意键继续
    退出请输入"exit"
    时间:2016.5.1
    语言:python 2.7
    包:BS,RE,URLLIB2,TIME,THREAD
------------------------------------------------
"""

print u"按下回车浏览今日糗百热门内容:"
raw_input('>')
if __name__=='__main__' :
    myModel = spider()
    myModel.start()


你可能感兴趣的:(爬虫,python)