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使用rabbitmq实现网络爬虫示例
Feb 20 Python
python机器学习之随机森林(七)
Mar 26 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
python抓取搜狗微信公众号文章
Apr 01 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
Python 图片添加美颜效果
Apr 28 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
PHP $_SERVER详解
2009/01/16 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php实现的ping端口函数实例
2014/11/12 PHP
php和asp语法上的区别总结
2019/05/12 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
img的onload的另类用法
2008/01/10 Javascript
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
对python中UDP,socket的使用详解
2019/08/22 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
房屋出售协议书
2014/04/10 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
办公室岗位职责
2015/02/04 职场文书
中学图书馆工作总结
2015/08/11 职场文书
六年级数学教学反思
2016/02/16 职场文书
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis