Python爬虫实战一之爬取糗事百科段子

参考资料:http://cuiqingcai.com/990.html

1.非面向对象模式

完整代码1:

# -*- coding: utf-8 -*-import reimport urllib2import urllibimport threadimport time

page = 1url = ‘http://www.qiushibaike.com/hot/page/‘ + str(page)user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘headers = { ‘User-Agent‘ : user_agent }try:    request = urllib2.Request(url,headers = headers)    response = urllib2.urlopen(request)    content = response.read().decode(‘utf-8‘)    pattern = re.compile(‘<div.*?class="author.*?<h2>(.*?)</h2>.*?<div.*?class="content.*?<span>(.*?)</span>.*?‘                         +‘<span.*?class="stats-vote">.*?<i.*?class="number">(.*?)</i>.*?‘                          +‘<span.*?class="dash">.*?<i.*?class="number">(.*?)</i>‘,re.S)    items = re.findall(pattern, content)    for item in items:         print item[0],item[1],item[2],item[3]except urllib2.URLError, e:    if hasattr(e,"code"):        print e.code    if hasattr(e,"reason"):        print e.reason运行结果如下:

注释1:糗事百科是不需要登录的,所以也没必要用到Cookie。

2.面向对象模式

上面代码是最核心的部分,下面我们要达到的目的是:

按下回车,读取一个段子,显示出段子的发布人,发布内容,点赞个数以及评论数。

另外我们需要设计面向对象模式,引入类和方法,将代码做一下优化和封装。

完整代码2:

# -*- coding: utf-8 -*-import reimport urllib2import urllibimport threadimport time

# 糗事百科爬虫类class QSBK:    # 初始化方法,定义一些变量def __init__(self):        self.pageIndex = 1self.user_agent = ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)‘# 初始化headersself.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)            # 构建请求的requestrequest = 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 Noneprint item[0], item[1], item[2], item[3]

pattern = re.compile(‘<div.*?class="author.*?<h2>(.*?)</h2>.*?<div.*?class="content.*?<span>(.*?)</span>.*?‘+ ‘<span.*?class="stats-vote">.*?<i.*?class="number">(.*?)</i>.*?‘+ ‘<span.*?class="dash">.*?<i.*?class="number">(.*?)</i>‘, re.S)        items = re.findall(pattern,pageCode)        # 用来存储每页的段子们pageStories = []        # 遍历正则表达式匹配的信息for item in items:            replaceBR = re.compile(‘<br/>‘)            text = re.sub(replaceBR, "\n", item[1])            # item[0]是一个段子的发布者,item[1]是内容,item[2]点赞数,item[3]评论数pageStories.append([item[0].strip(), text.strip(), item[2].strip(), item[3].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 = Falsereturn            print u"第%d页\t发布人:%s\t评论:%s\t赞:%s\n%s" % (page, story[0], story[3], story[2], story[1])

# 开始方法def start(self):        print u"正在读取糗事百科,按回车查看新段子,Q退出"# 使变量为True,程序可以正常运行self.enable = True# 先加载一页内容self.loadPage()        # 局部变量,控制当前读到了第几页nowPage = 0while 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()

运行结果如下:


设计面向对象模式

时间: 2024-10-06 16:28:48

Python爬虫实战一之爬取糗事百科段子的相关文章

Python爬虫实战-爬取糗事百科段子

1.本文的目的是练习Web爬虫 目标: 1.爬去糗事百科热门段子 2.去除带图片的段子 3.获取段子的发布时间,发布人,段子内容,点赞数. 2.首先我们确定URL为http://www.qiushibaike.com/hot/page/10(可以随便自行选择),先构造看看能否成功 构造代码: 1 # -*- coding:utf-8 -*- 2 import urllib 3 import urllib2 4 import re 5 6 page = 10 7 url = 'http://www

Python爬虫爬取糗事百科段子内容

参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码: #coding=utf-8#!/usr/bin/pythonimport urllibimport urllib2import reimport threadimport timeimport sys #定义要抓取的网页#url = 'http://www.qiushibaike.com/hot/'#读取要抓取的网页#globalcontent = urllib.urlopen(url).read()#抓取段子内容#new_

python爬取糗事百科段子

初步爬取糗事百科第一页段子(发布人,发布内容,好笑数和评论数) 1 #-*-coding:utf-8-*- 2 import urllib 3 import urllib2 4 import re 5 page = 1 6 url ='http://www.qiushibaike.com/hot/page/'+str(page) #第一页URL 7 headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/

芝麻HTTP:Python爬虫实战之爬取糗事百科段子

首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的情况,是因为正则表达式没有匹配到的缘故. 现在,博主已经对程序进行了重新修改,代码亲测可用,包括截图和说明,之前一直在忙所以没有及时更新,望大家海涵! 更新时间:2015/8/2 糗事百科又又又又改版了,博主已经没心再去一次次匹配它了,如果大家遇到长时间运行不出结果也不报错的情况,请大家参考最新的评

Python爬虫-爬取糗事百科段子

闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/hot/page/2/    末尾2指第2页 2.先抓取HTML页面 import urllib import urllib2 import re page = 2 url = 'http://www.qiushibaike.com/hot/page/' + str(page) #对应第2页的url

爬虫二:爬取糗事百科段子

这一次我们利用BeautifulSoup进行网页的解析,方法其实跟前一次的差不多,只是这里我们爬取的是糗事百科,糗事百科有反爬机制,我们需要模拟用户来访问糗事百科网站,也就是加上头部信息headers,其实整体思路与上一篇所写爬虫的思路差不多,拿个速度可以共用. 1.首先我们在打开网页,并在网页空白处右击选择"检查"在弹出的网页里选择"Network" 2.然后按下"F5"刷新一下 3.在刷新后的页面里我们可以看到多条信息,任意选择一条信息点开

#python爬虫:爬取糗事百科段子

#出处:http://python.jobbole.com/81351/#确定url并抓取页面代码,url自己写一个import urllib,urllib2def getUrl(): page=1 url="http://www.qiushibaike.com/hot/page/"+str(page) try: request=urllib2.Request(url) response=urllib2.urlopen(request) print response.read() ex

Python 爬取糗事百科段子

直接上代码 #!/usr/bin/env python # -*- coding: utf-8 -*- import re import urllib.request def gettext(url,page): headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/53

Python爬虫--抓取糗事百科段子

今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该博主的代码似乎有些问题,我自己做了修改,运行成功,下面是代码内容: 1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 import urllib2 4 import re 5 6 #糗事百科爬虫类 7 class QSBK: 8 #初始化 9 def __