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 splitlines使用技巧
Sep 06 Python
使用Python的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
python自动翻译实现方法
May 28 Python
Python 爬虫图片简单实现
Jun 01 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Python 创建空的list,以及append用法讲解
May 04 Python
python判断数字是否是超级素数幂
Sep 27 Python
python字符串Intern机制详解
Jul 01 Python
通过实例了解python property属性
Nov 01 Python
django的autoreload机制实现
Jun 03 Python
python如何进行基准测试
Apr 26 Python
python内置进制转换函数的操作
Jun 02 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中fsockopen用法实例
2015/01/05 PHP
PHP Cookie学习笔记
2016/08/23 PHP
Javascript模板技术
2007/04/27 Javascript
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
2013/05/11 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
js实现带进度条提示的多视频上传功能
2020/12/13 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
用Python编写一个国际象棋AI程序
2014/11/28 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
python找出完数的方法
2018/11/12 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
班主任工作年限证明
2014/01/12 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
吨的认识教学反思
2014/04/27 职场文书
团日活动总结书
2014/05/08 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
大学生实习介绍信
2015/05/05 职场文书
2016年教师新年寄语
2015/08/18 职场文书
python 爬取天气网卫星图片
2021/06/07 Python