python爬虫入门(博客搬家的实现)

来源:互联网 发布:开户行数据库 编辑:程序博客网 时间:2024/05/16 17:17
python爬虫入门(博客搬家的实现)

python是数据挖掘里最常用的脚本语言之一了,python作为一个很有用的工具,常用来爬取web数据。很无奈,图书馆里的关于爬虫入门的书籍写的都跟渣渣一样,而且大都是以java为主题语言的。刚刚上了网络公开课,打算分享一下如何用python写一个简单的爬虫,我将以爬取我原来的新浪博客的内容为例子来介绍。
其实csdn的博客搬家好像也是类似的,为了让python自动下载新浪博客上的文章。 
首先,需要了解新浪博客的HTML格式特点,我先利用chrome浏览器审查元素,查看每篇文章的标题信息。
<pre name="code" class="html"><a title="将博客搬至CSDN" target="_blank" href="http://blog.sina.com.cn/s/blog_7f6d9f7a0102vd6j.html">将博客搬至CSDN</a>
如上所示,这是我新浪博客的博文目录里的一篇文章的title的html信息。
简单的分析一下,title里面是对应文章的名字,href后面是对应文章的链接地址。
如此一来,为了让python批处理下载目录里的文章到本地,我们就在一个循环里面寻找博文的链接地址,并存储到url数组中。
然后再用python的库来读取链接网址对应的内容,并保存导出到本地文件。
这样一来,就实现了python自动批处理下载文章。
但是,在处理的过程中发现了几个小问题需要解决,就是中文编码的问题。我是在windows上测试的,所以用python下载下来的文件会出现中文乱码,为了解决这个问题,可以用两个函数来解决
str.decode('utf-8').encode('gbk')
str是一个包含中英文的字符串,通过改变它的编码,就可以实现中文正常显示了

 还有一个问题就是新浪博客里的html中,文章的title的空格是用 &nbsp; 表示的!还有,保存到本地文件的时候,windows文件名不能用标点符号,所以我们就利用replace函数,把这些东西换成空格。
str.replace(' ', ' ').replace(':', ' ')

然后由于文件写入写出是需要时间的,所以我们暂定每次读取文件需要5s
time.sleep(5)

基本思想就是如上所示了,上代码,看代码会更清楚整个爬取的流程,这样一来,就实现了python爬取博客内容,实现博客搬家了!得意

#SYSU-Software#Dirk Kim#http://blog.csdn.net/luoshengkim?viewmode=contents#coding=utf-8import urllibimport timeurl = ['']*50name = ['']*50con = urllib.urlopen('http://blog.sina.com.cn/s/articlelist_2137890682_0_1.html').read()#下面的代码是寻找博文的链接地址,并存储到url数组中i = 0title = con.find('<a title=')href = con.find('href=', title)html = con.find('.html', href)while title != -1 and href != -1 and html != -1 and i < 50:    url[i] = con[href + 6:html +5]    print url[i]    title = con.find('<a title=', html)    href = con.find('href=', title)    html = con.find('.html', href)    i = i + 1else:    print 'find end!'    #下面的代是寻找每篇文章的名字    k = 0title = con.find('<a title=')href = con.find('href=', title)while title != -1 and href != -1 and k < 50:    name[k] = (con[title + 10:href - 18] + '.html').replace(' ', ' ').replace(':', ' ').decode('utf-8').encode('gbk')    print name[k]    title = con.find('<a title=', href)    href = con.find('href=', title)    k = k + 1j = 0while j < 50:    content = urllib.urlopen(url[j]).read()    open('kim/' + name[j], 'w+').write(content)    print 'downloading', url[j]    j = j + 1    time.sleep(5)else:    print 'Download Completed'



0 0