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 相关文章推荐
windows下python连接oracle数据库
Jun 07 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
python树莓派红外反射传感器
Jan 21 Python
Python3批量生成带logo的二维码方法
Jun 24 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
Python3 集合set入门基础
Feb 10 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
Python tkinter实现简单加法计算器代码实例
May 13 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 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
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
js arguments,jcallee caller用法总结
2013/11/30 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
[51:53]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第二场 11.01
2020/11/02 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
Python中的 enum 模块源码详析
2019/01/09 Python
浅析python中while循环和for循环
2019/11/19 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
探矿工程师自荐信
2014/01/24 职场文书
求职自荐信的格式
2014/04/07 职场文书
市政管理求职信范文
2014/05/07 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
武侯祠导游词
2015/02/04 职场文书
2016关于军训的心得体会
2016/01/11 职场文书