文档章节

Python 网络爬虫 - 抓取糗事百科的段子(最新版)

夲仒無道
 夲仒無道
发布于 2015/09/24 16:05
字数 460
阅读 1450
收藏 13

代码


# -*- coding: cp936 -*-
__author__  = "christian chen"
import urllib2
import re
import threading
import time

class Tool:
    def pTitle(self):
        return re.compile('<title.*?>(.*?)</', re.S)

    def pContent(self):
        return re.compile('<div class="author.*?>.*?<a.*?<img.*?/>(.*?)</a>.*?</div>.*?<div.*?class="content.*?>(.*?)</div>.*?class="number.*?>(.*?)</.*?', re.S)

class CSBK(threading.Thread):
    def __init__(self, max_page):
        threading.Thread.__init__(self, name='christian_thread')
        self.baseUrl = "http://www.qiushibaike.com/hot/page/"
        self.maxPage = int(max_page) + 1
        self.tool = Tool()
        
    def getPageContent(self, pageNum):
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = { 'User-Agent' : user_agent }
        url = self.baseUrl + str(pageNum)
        try:
            request = urllib2.Request(url, headers=headers)
            response = urllib2.urlopen(request)
            content = response.read().decode('utf-8', 'ignore')
            content = content.encode('gbk', 'ignore')
            return content
        except urllib2.URLError, e:
            if hasattr(e,"reason"):
                print u"error: ", e.reason
                return None
            
    def getPageDetail(self, c):
        items = re.findall(self.tool.pContent(), c)
        result = []
        for item in items:
            p = {}
            p['发布人'] = item[0].strip()
            p['id'] = item[2].strip()
            p['内容'] = item[1].strip()
            result.append(p)
        return result

    def getTitle(self, c):
        result = re.findall(self.tool.pTitle(), c)
        return result[0].strip()

    def run(self):
        print "---- " + time.ctime() + " ----\n"
        for page in range(1, self.maxPage):
            c = self.getPageContent(page)
            if c == None:
                print "URL已失效,请重试"
                return

            print "---- 正在抓取第" + str(page) + "页 ---- "
            title = self.getTitle(c)
            f = open(title + ' - Page_' + str(page) + '.txt', 'w')
            result = self.getPageDetail(c)
            cutLine = u'-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.\n'
            for item in result:
                f.write(cutLine)
                for K, V in item.items():
                    f.write(str(K) + ' : ' + str(V) + '\n')
            print "---- 第" + str(page) + "页抓取完毕 ----\n"

            f.close()
            del result
            del f
            del cutLine
            del c
        print "---- " + time.ctime() + " ----"
        
maxPage = raw_input("输入想抓取的糗事百科的最大页数: \n")
csbk = CSBK(maxPage)
csbk.start()



效果图

这里是Freestyletime@foxmail.com,欢迎交流。

本人原创作品,转载请标明出处。


© 著作权归作者所有

夲仒無道

夲仒無道

粉丝 15
博文 24
码字总数 17435
作品 0
朝阳
技术主管
私信 提问
加载中

评论(2)

s
sosozzzx
试试神箭手云爬虫平台的段子采集爬虫[内涵段子]支持云端自动采集,实时更新信息~
爬虫链接:http://www.shenjianshou.cn/index.php?r=market/configDetail&pid=158
c
cangbaotu
这个代码量挺大 看看我写的js的爬取糗事百科的爬虫:

var configs = {
domains: ["www.qiushibaike.com"],
scanUrls: ["http://www.qiushibaike.com/"],
contentUrlRegexes: ["http://www\\.qiushibaike\\.com/article/\\d+"],
fields: [
{
name: "content",
selector: "//*[@id='single-next-link']",
required: true
},
{
name: "author",
selector: "//div[contains(@class ,'author')]//h2"
}
]
};
start(configs);
简单多了吧 怎么运行参考我的文档:https://github.com/ShenJianShou/crawler_samples/blob/master/%E5%A6%82%E4%BD%95%E6%89%A7%E8%A1%8C%E6%A0%B7%E4%BE%8B%E4%BB%A3%E7%A0%81.txt
分享我自己写的一套Python爬虫学习经验

最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多。学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴...

崔庆才
2015/02/23
4K
25
Python爬虫--抓取糗事百科段子

今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单。程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该博主的代码似乎有...

周东尧
2016/08/22
224
1
Python爬虫框架Scrapy架构和爬取糗事百科段子结果

根据上篇文章《Python爬虫框架Scrapy之爬取糗事百科大量段子数据》(传送门:Python爬虫框架Scrapy之爬取糗事百科大量段子数据),写好了糗百段子的爬虫,接下来就是开始运行然后获取结果了。...

铁扇公主1
2017/05/24
258
0
Python分分钟爬取糗事百科,让自己充满内涵

使用Python爬取糗事百科 代码如下: 必须加上head否则无法抓取. 学习资料也可以加下Python扣扣裙:四八三五四六四一六自己下载学习下 虽然核心部分已经完成了,但是还需要将代码更改为面向对...

python达人
2018/05/19
0
0
Python3.x实现简单爬虫—爬糗事百科

1、Python版本:3.5,urllib库, 2、爬取糗事百科24小时热门段子,第一页(网页地址:http://www.qiushibaike.com/hot/1) 3、使用正则匹配, re库 4、Python2的urllib、urllib2合并成pytoh...

大猩猩secrets
2016/10/25
77
0

没有更多内容

加载失败,请刷新页面

加载更多

ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
今天
4
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
14
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部