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实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
Dec 18 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
python树莓派红外反射传感器
Jan 21 Python
深入浅析python 协程与go协程的区别
May 09 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
python如何实现不用装饰器实现登陆器小程序
Dec 14 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 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 301转向实现代码
2008/09/18 PHP
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
js精度溢出解决方案
2012/12/02 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
使用webpack和rollup打包组件库的方法
2021/02/25 Javascript
python list转dict示例分享
2014/01/28 Python
python里对list中的整数求平均并排序
2014/09/12 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
Python常见异常分类与处理方法
2017/06/04 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
使用python去除图片白色像素的实例
2019/12/12 Python
Python中的面向接口编程示例详解
2021/01/17 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
体育教师自我鉴定
2014/02/12 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
PHP遍历数组的6种方式总结
2021/11/17 PHP
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript