python实现批量下载新浪博客的方法


Posted in Python onJune 15, 2015

本文实例讲述了python实现批量下载新浪博客的方法。分享给大家供大家参考。具体实现方法如下:

# coding=utf-8 
import urllib2
import sys, os
import re
import string
from BeautifulSoup import BeautifulSoup
def encode(s):
  return s.decode('utf-8').encode(sys.stdout.encoding, 'ignore')
def getHTML(url):
  #proxy_handler = urllib2.ProxyHandler({'http':'http://211.138.124.211:80'})
  #opener = urllib2.build_opener(proxy_handler)
  #urllib2.install_opener(opener)
  req = urllib2.Request(url)
  response = urllib2.urlopen(req, timeout=15)
  return BeautifulSoup(response, convertEntities=BeautifulSoup.HTML_ENTITIES)
def visible(element):
  '''抓取可见的文本元素'''
  if element.parent.name in ['style', 'script', '[document]', 'head', 'title']:
    return False
  elif re.match('<!--.*-->', str(element)):
    return False
  elif element == u'\xa0':
    return False
  return True
def delReturn(element):
  '''删除元素内的换行'''
  return re.sub('(?<!^)\n+(?!$)', ' ', str(element)).decode('utf-8')
def validFilename(filename):
  # windows
  return re.sub('[\/:*?<>"|\xa0]', '', filename)
def writeToFile(text, filename, dirname):
  if not os.path.exists(dirname):
    os.makedirs(dirname)
    print encode('保存到目录'), dirname
  filename = validFilename(filename)
  print encode('保存文章'), filename
  path = os.path.join(dirname, filename)
  if not os.path.exists(path):
    f = open(path, 'w')
    f.write(text)
    f.close()
  else:
    print filename, encode('已经存在')
def formatContent(url, title=''):
  '''格式化文章内容'''
  page = getHTML(url)
  content = page.find('div', {'class':'articalContent'})
  art_id = re.search('blog_(\w+)\.html', url).group(1)
  blog_name = page.find('span', id='blognamespan').string
  if title == '':
    title = page.find('h2', id=re.compile('^t_')).string
  temp_data = filter(visible, content.findAll(text=True)) # 去掉不可见元素
  temp_data = ''.join(map(delReturn, temp_data)) # 删除元素内的换行符
  temp_data = temp_data.strip() # 删除文章首尾的空行
  temp_data = re.sub('\n{2,}', '\n\n', temp_data) # 删除文章内过多的空行
  # 输出到文件
  # 编码问题
  temp_data = '本文地址:'.decode('utf-8') + url + '\n\n' + temp_data
  op_text = temp_data.encode('utf-8')
  op_file = title + '_' + art_id +'.txt'
  writeToFile(op_text, op_file, blog_name)
def articlelist(url):
  articles = {}
  page = getHTML(url)
  pages = page.find('ul', {'class':'SG_pages'}).span.string
  page_num = int(re.search('(\d+)', pages).group(1))
  for i in range(1, page_num+1):
    print encode('生成第%d页文章索引'%i)
    if i != 1:
      url = re.sub('(_)\d+(\.html)$', '\g<1>'+str(i)+'\g<2>', url)
      page = getHTML(url)
    article = page.findAll('span', {'class':'atc_title'})
    for art in article:
      art_title = art.a['title']
      art_href = art.a['href']
      articles[art_title] = art_href
  return articles
def blog_dld(articles):
  if not isinstance(articles, dict):
    return False
  print encode('开始下载文章')
  for art_title, art_href in articles.items():
    formatContent(art_href, art_title)
if __name__ == '__main__':
  sel = raw_input(encode('你要下载的是(1)全部文章还是(2)单篇文章,输入1或者2: '))
  if sel == '1':
    #articlelist_url = 'http://blog.sina.com.cn/s/articlelist_1303481411_0_1.html'
    articlelist_url = raw_input(encode('请输入博客文章目录链接: '))
    articles = articlelist(articlelist_url)
    blog_dld(articles)
  else:
    #article_url = 'http://blog.sina.com.cn/s/blog_4db18c430100gxc5.html'
    article_url = raw_input(encode('请输入博客文章链接: '))
    formatContent(article_url)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
Python标准库笔记struct模块的使用
Feb 22 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
浅谈python 中类属性共享的问题
Jul 02 Python
python实现大文件分割与合并
Jul 22 Python
python3中rank函数的用法
Nov 27 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
Python新手学习函数默认参数设置
Jun 03 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
深入理解Python中各种方法的运作原理
Jun 15 #Python
python字符串编码识别模块chardet简单应用
Jun 15 #Python
Python字符串格式化
Jun 15 #Python
Java中重定向输出流实现用文件记录程序日志
Jun 12 #Python
Python2中的raw_input() 与 input()
Jun 12 #Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 #Python
Python3中的2to3转换工具使用示例
Jun 12 #Python
You might like
用session做客户验证时的注意事项
2006/10/09 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
关于JS管理作用域的问题
2013/04/10 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
Python实现图像几何变换
2015/07/06 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
pycharm运行出现ImportError:No module named的解决方法
2018/10/13 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
助人为乐表扬信范文
2014/01/14 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书