上次写了一个爬世纪佳缘的爬虫之后,今天再接再厉又写了一个新浪博客的爬虫。写完之后,我想了一会儿,要不要在博客园里面写个帖子记录一下,因为我觉得这份代码的含金量确实太低,有点炒冷饭的嫌疑,就是把上次的代码精简了一下,用在另外一个网站而已,而且爬别人的博客总有一种做贼心虚的感觉,怕被各位园友认为是偷窥狂魔。但是这份代码总归是我花了精力去写的,我也不想就此让它深藏在硬盘之中(电脑实在太老了,可能过两年硬盘坏了,这份代码就消失了),还是贴出来权当作抛砖引玉。

说起要爬新浪博客,总归是有一个原因吧。我的原因呢也是什么的简单,就是这两天在网上下载了一本python自然语言处理的一本书,就像尝试着应用一下里面的理论(其实我都还没看呢 哈哈),当然照着书里面的例子玩总归是没什么成就感的,所以就想自己找点东西实验一下。可能你觉得这个原因和爬新浪博客没什么必然联系啊,确实如此,前面扯的东西太虚了,我写这个东西就是为了满足一下自己的偷窥欲望,把曾经女神的博客都下载下来(大家不要喷。。),顺便在用前面讲的高大上的自然语言理论处理一下(估计很难,八成做不下去)。

讲了这么多废话了,现在开始说一说爬虫的工作原理。先原谅我粗糙的涂抹技术,因为实在不想把再出现上次帖子中的情况,大家纷纷在评论中讨论我在知乎看什么。首先在新浪播客找到你要下载用户的主页,在地址栏中最后一般有一个数字对应于用户的id,因为每页放的文章有限,新浪博客采用了分页,对应于url里面的page=2,就是第二页的意思。在当前的页面我们可以用正则表达式解析出文章的发表时间,“查看原文”的链接中找到文章的链接。

因为新浪博客比较开放的原因,不登陆也能查看文章那个的内容,所以就直接用python里的urllib2,也不需要设置cookies,省去了很多麻烦。唯一比较麻烦的是如果文章里面有图片是多媒体的链接,提取里面的文字比较麻烦和繁琐,因为这个界面比较简单,当然也可以直接解析html,不过我已经习惯了正则表达式,虽然很麻烦,但还是硬着头皮写完了。其中正则表达式的替换字符串的功能非常的好用,就重点讲一讲这个吧!

在遇到复杂的字符串替换的时候,正则表达式的sub函数用起来非常的easy。贴一段简单的代码:

#-*- encoding:UTF-8 -*-
import re s = u'''<div class="class1">this is string1</div>
<div class="class2">这是字符串二</DIV>''' def div_func(m):
if m is None:
return ''
return m.group(1) if __name__ == '__main__':
pattern = re.compile(u'<div[\S ]*?>(.*?)</div>', re.U | re.S | re.I)
print s
sss = pattern.sub(div_func, s)
print
print sss

在网页中,会碰到很多不同的格式,如代码里面的字符串s,如果想把里面的文字提取出来,对于比较复杂的替换要求,我们可以定义一个函数作为参数传给sub进行处理,运行的结果如下图所示,是不是非常的方便?

再讲讲python的中文编码问题吧,最简单的处理就是尽可能少的用str,尽可能多的用unicode。对于来自文件的输入数据,最好先解码为unicode再做处理,这样可以减少90%的乱码问题。哦,对了,今天还发现了一个非常好用的一个函数,可以用来下载文件

import urllib
urllib.urlretrieve(url, path)

此函数可以将url中的文件下载到本地路径path中,是不是非常的简单。最后展示一下。当然数据不多啦,女神也就一百多篇的文章,用数据库有点杀鸡用牛刀的感觉,直接输出到一个文本文件里面也是挺方便的哈!

最后的最后,还是把源代码贴出来以供大家参考哈!(由于本人实在不擅长描述细节,所以写的很粗,望大家多多见谅啊!)

链接:http://files.cnblogs.com/files/lrysjtu/xlblog.rar

python网络爬虫 新浪博客篇的更多相关文章

  1. Python爬虫爬取一篇韩寒新浪博客

    网上看到大神对Python爬虫爬到非常多实用的信息,认为非常厉害.突然对想学Python爬虫,尽管自己没学过Python.但在网上找了一些资料看了一下,看到爬取韩寒新浪博客的视频.共三集,第一节讲爬取 ...

  2. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  3. python中multiprocessing.pool函数介绍_正在拉磨_新浪博客

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客     python中multiprocessing.pool函数介绍    (2010-06-10 03:46:5 ...

  4. python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客

    python datetime模块strptime/strptime format常见格式命令_施罗德_新浪博客     python datetime模块strptime/strptime form ...

  5. python中逐行读取文件的最佳方式_Drupal_新浪博客

    python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式    (2010-08-18 15:59:28)    转载▼    标签:    python   ...

  6. python—webshell_醉清风xf_新浪博客

    python—webshell_醉清风xf_新浪博客 python—webshell (2012-05-23 09:55:46) 转载▼

  7. Word直接发布新浪博客(以Wo…

    原文地址:Word直接发布新浪博客(以Word 2013为例)作者:paulke2011 注意:这篇博客直接由Word 2013发出!这虽然也算是一个教程,但更多的是一个试验品. 老早就知道Word有 ...

  8. [转载]Word直接发布新浪博客(以Word 2013为例)

    原文地址:Word直接发布新浪博客(以Word 2013为例)作者:paulke2011 注意:这篇博客直接由Word 2013发出!这虽然也算是一个教程,但更多的是一个试验品. 老早就知道Word有 ...

  9. 用python2.7,采集新浪博客

    #coding=utf-8 #新浪博客 import urllib import re import os url=['']*1500 #每一骗博客的地址 title=['']*1500 #每一篇博客 ...

随机推荐

  1. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  2. Oracle安装部署,版本升级,应用补丁快速参考

    一.Oracle安装部署 1.1 单机环境 1.2 Oracle RAC环境 1.3 Oracle DataGuard环境 1.4 主机双机 1.5 客户端部署 二.Oracle版本升级 2.1 单机 ...

  3. var和dynamic的区别

    1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...

  4. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  5. 好用的Markdown编辑器一览 readme.md 编辑查看

    https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...

  6. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...

  7. BZOJ3198[SDOI2013]SPRING

    Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT 题 ...

  8. 谈谈document.ready和window.onload的区别

    在Jquery里面,我们可以看到两种写法:$(function(){}) 和$(document).ready(function(){}) 这两个方法的效果都是一样的,都是在dom文档树加载完之后执行 ...

  9. XSS 前端防火墙 —— 整装待发

    到目前为止,我们把能用前端脚本防御 XSS 的方案都列举了一遍. 尽管看起来似乎很复杂累赘,不过那些是理论探讨而已,在实际中未必要都实现.我们的目标只是为了预警,能发现问题就行,并非要做到滴水不漏的程 ...

  10. [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)

    今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...