文档章节

爬虫随便玩玩: CU shell 板块

Lin_R
 Lin_R
发布于 2017/02/25 13:30
字数 1595
阅读 522
收藏 21
点赞 5
评论 0

前言

身为运维岗的小屌丝, 对于shell, 甚至文本三剑客, 总是不可分割的, 因为工作上, 特别是日志处理查找等, 更能体现出三剑客的强大功力. 虽然说教程网上都有, 但是缺乏练习总会让自己过眼就忘, 刚好Cu上的shell板块有很多练习, 所以写了个专门抓这些问题的爬虫, 来方便我们做练习. 事不宜迟, 简单讲解下分析步骤

准备工作

   为了达到练习效果, 咱们不用bs或者pyquery, 所以我们在内容整理方面用re库就够了

  • python2.x
  • requests库
  • re库

过程分解

CU shell板块链接: http://bbs.chinaunix.net/forum-24-1.html

打开链接如图所示, 可以看到红框选中的, 就是shell板块的问题, 咱们的任务就是要将这些帖子的内容, 要爬出来.

第一步: 定位问题帖子

要想找到准确定位这些帖子, 咱们要先找到这些帖子的html标签的共同点 以及和 别的便签的不同点, 右键查看源码, 随便搜索一个中文用来定位相应地方的源码:

如图所示, 我通过其中一个问题关键字: "grep -v l两个可否简化", 已经定位到相应地方的源码, 可以看到问题描述,链接都包含在一个<th></th>标签内, 那咱们直接过滤出每个th块就好了

第二步: 从问题帖子块提取有用信息

咱们已经确定了, 需要的内容在th块中, 那么一个块有什么信息是咱们关注的呢? 

从图可以看出, 一个短短的th块, 就已经包含了: 问题类型, 问题链接 和问题的标题了, 问题类型和问题标题将后期输出整理时会用到, 而问题链接是我们马上需要用到的, 因为我们需要从里面获取具体内容,获取的方法也是很简单 可以明显看到, 虽然地址在a标签的href属性中, 但是a标签却有2个, 所以如果单纯获取a标签, 那么将会有多余的结果, 所以这里先定位到 "]" 再来获取

base_content_pattern = re.compile(
      '\[<a[^>]+>(?#quesiton_type)([^<]+)[^"]+"(?#quesiton_url)([^"]+).*?>(?#quesiton_title)([^<]+)</a'
)
正则讲解:
(?#..)只是用来注释的, 并不会对匹配结果有干扰; 所以 (?#content)xxx 是表示 xxx是关于content的正则

关于问题类型的正则:
(?#quesiton_type)([^<]+): 用于捕获: >文本处理<a位置的 '文本处理'

关于问题链接的正则:
(?#quesiton_url)([^"]+): 用于捕获: <a href="thread-4259680-1-1.html 位置的 '非"内容,也就是链接地址'

关于问题标题的正则: 
(?#quesiton_title)([^<]+)</a: 用于捕获: >grep -v l两个可否简化</a> 位置的 'grep -v l两个可否简化'

经过上诉的处理, 我们已经从一个th块, 取出 问题类型, 问题链接 和问题的标题了, 那么我们将这些结果存到一个列表, 后期在根据这列表内容来做具体的问题内容获取和整理输出

第三步: 对具体的 问题链接 做具体内容的抓取

和第一步同样的做法, 查看页面源代码, 搜索问题关键字, 找到结果如下:

而且很幸运的可以看到, 所处的那块有个唯一的字符: JIATHIS_CODE_HTML4, 所以咱们可以通过这个位置, 来截获到下面的 </td>, 也就是:

content_pattern = re.compile('JIATHIS_CODE_HTML4">(.*?)</td', re.S)

其实到了这一步, 爬虫已经完成80%了, 接下来就是最最后的清洗整理

第四部步: 对 具体的问题内容 作数据整理

在我们匹配出问题内容时, 数据还是很粗糙, 因为有很多html标签, 例如<br>, &nbsp; 等等, 就好像上个步骤提取的内容:

u' \r\n<div class="t_fsz">\r\n<table cellspacing="0" cellpadding="0"><tr><td class="t_f" id="postmessage_24624780">\r\n\u73b0\u6025\u9700\u89e3\u51b3\u6b64\u95ee\u9898\uff1a<br />\r\n2\u4e2a\u6587\u4ef6\uff1a<br />\r\n1.txt&nbsp;&nbsp;5\u5217 1.5G<br />\r\n2.txt&nbsp;&nbsp;12\u5217 2.6G<br />\r\n awk \'NR==FNR{a[$1&quot; &quot;$2&quot; &quot;$3]=$4&quot; &quot;$5}NR&gt;FNR{if(a[$3&quot; &quot;$6&quot; &quot;$10]!=&quot;&quot;&amp;&amp;a[$3&quot; &quot;$6&quot; &quot;$10]!=&quot; &quot;)print $1,$2,$3,a[$3&quot; &quot;$6&quot; &quot;$10]}\' 1.txt 2.txt<br />\r\n\u8fd0\u884c\u540e\u62a5\u9519\uff1athere is not enough availiable memory<br />\r\n\u8bf7\u95ee\u8be5\u5982\u4f55\u89e3\u51b3\uff1f'

可以看到有很多&nbsp,&quot;等等, 所以我们需要该转换的转换, 该去掉的去掉,咱们构建一个转换字典

self.html_flag_converation = {
            '&nbsp;': ' ',
            '<br />':  '\n',
            '&quot': '"',
            '&lt;': '<',
            '&gt;': '>'
        }

意思很明确, 就是将对应的html标签转换成它在页面表示的符号

除了页面的html, 有些提问者可能会无意中多敲了好多回车, 导致咱们过滤的结果也是有好多换行, 但咱们并不需要那么多行, 所以统一换成一个

content_result = re.sub(r'<.*?>|\r\n|\r', '', content_result)
content_result = re.sub(r'\n+', '\n', content_result)

经过上面的处理, 文本已经算是可以了~ 我们再把之前获取的 问题类型 问题标题 加上去, 就是一个完整的问题了

在输出方面, 咱们有个点需要考虑, 就是保存到文件, 有时候咱们需要马上来一发练习题, 联系完就算了;但是有时候, 有些勤奋的同学, 想要通过计划任务去定时抓, 然后保存;

所以为了兼容这两个, 用一个比较简单的方法实现:

class Spider:
    """
    China Unix Bss spider
    """
    def __init__(self, output=None):
        ...
        if output:
            self.result_output = open(output, 'w')
        else:
            self.result_output = sys.stdout


if __name__ == '__main__':
    file_name = None
    if len(sys.argv) == 2:
        file_name = sys.argv[1]

    spider = Spider(output=file_name)
    spider.start()
[root@iZ23pynfq19Z ~]# python spider_cu.py          # 直接输出到屏幕
[root@iZ23pynfq19Z ~]# python spider_cu.py   file   # 直接输出到文件, 屏幕只是打印写入的问题id

好了, 通过上面的输出方式, 再通过如下将问题标题, 问题类型等等整合到一起, 爬虫就完成了:

self.result_output.write('-' * 30 + '\n')
self.result_output.write('Question_title: %s\nQuestion_type: %s\nQuestion_url: %s\n' % (
    content_title.encode('utf8'),
    content_type.encode('utf8'),
    content_url.encode('utf8')
))
self.result_output.write('Question_content:\n%s' % content_result.encode('utf8'))

结果展示

爬虫源码地址

https://git.oschina.net/Lin_R/Simple_Spider/blob/master/spider_cu.py?dir=0&filepath=spider_cu.py&oid=012937ecb3c133fc5d96113f45cc68ee402a88ea&sha=7db09f0ab5fd935167df9dfb948729867c10f9fe

欢迎各位大神指点, 转载请注明: https://my.oschina.net/LinBigR/blog/846211

© 著作权归作者所有

共有 人打赏支持
Lin_R
粉丝 41
博文 18
码字总数 20310
作品 0
广州
程序员
Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家
06/24
0
0
Exchange 2016 CU7全新部署Ecp打开出现空白界面

问题介绍: 最近无聊中在网上看到了MVP大神说Exchange 2016出CU7了,但是在微软版本介绍那个界面竟然没有,郁闷啊,然后就找了下,竟然真出CU7了,于是就搭建了一套Exchange 2016 CU7的环境玩...

Juck_Zhang
2017/11/26
0
0
看我如何利用Python写简单网络爬虫

平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看 先分析网站内容,红色部分即是网站文章内容div...

黑武士
2015/02/11
46.4K
18
实战(一)之使用自带urllib和re正则表达式获取电影详情页链接

一、关于urllib库 网上urllib库的教程文章非常多而且详细具体,我就不过多叙述和重复了,个人更加倾向于将精力放在实战上,而不是反反复复拷贝教程(其实是因为我懒),来几篇干货参考。 py...

鱼头豆腐文
2017/12/04
0
0
股市板块轮动明显,想开发一款主题投资工具,缺少基础数据,请问如何获取主题资讯数据

想开发主题投资工具 目前沪指大幅震荡板块轮动明显,想开发一款主题投资工具,为股民把握市场风格变幻助力: 1.通过新闻资讯和市场行情,自动挖掘-》发现-》推荐 新主题和热点主题 2. 自动关...

Rain20150610
2015/06/10
155
1
利用大数据技术分析新浪财经美股行情

学习大数据技术有一段时间了,之前也写过一些零零散散的博客,作为自己学习的一些记录,不过每篇博客都只是涵盖部分技术。这次想写一篇比较完整的博客,记录一个完整的项目从头到尾生产的过程...

teaGod
2017/12/14
0
0
如何学习数据库编程呢?

我是搞嵌入式C的 想学数据库编程 怎么入门,我想自己搞个博客网站玩玩,随便学学数据库编程,想用mysql+python,高手请指条路子。

___py_liang
2012/04/03
1K
8
Scrapy常用命令

命令 说明 格式 startproject 创建一个新工程 scrapy startproject [dir] genspider 创建一个爬虫 scrapy genspider [options] settings " 获得爬虫配置信息 scrapy settings [options] craw......

NiceBlueChai
2017/11/26
0
0
论坛数据能帮你做什么 5分钟风控数据干货系列

     相信大家对论坛都不陌生,论坛氛围自由,可以方便的交流信息。信贷领域也有相应的垂直论坛,一方面为金融机构提供信息发布、整合营销的渠道,另一方面为用户提供各类理财、贷款、信...

FreeBuf
02/22
0
0
无聊啊!玩个游戏都作弊,随便用od改改钱。

我可怜的单核本本,想玩大作游戏,只能玩玩diablo了,想玩玩里面的赌博,又没钱,杀怪拣的钱又不够用,于是就想抄起od改改钱(游戏修改器东西就免用了),简单说说过程: 1,先找找钱在哪个地...

极品渣子
2012/07/02
1K
13

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周一乱弹 —— 如果是你喜欢的女同学找你借钱

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @guanglun :分享Michael Learns To Rock的单曲《Fairy Tale》 《Fairy Tale》- Michael Learns To Rock 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
24分钟前
7
3
NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
11
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部