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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python标准库inspect的具体使用方法
Dec 06 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
Jan 09 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
Python中os模块的简单使用及重命名操作
Apr 17 Python
Python道路车道线检测的实现
Jun 27 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
php中如何执行linux命令详解
2018/11/06 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
js 操作符汇总
2014/11/08 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
python读取Android permission文件
2013/11/01 Python
python函数装饰器用法实例详解
2015/06/04 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python实现银行实战系统
2020/02/26 Python
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
怎样写演讲稿
2014/01/04 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL