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回调函数的使用方法
Jan 23 Python
跟老齐学Python之??碌某?? target=
Sep 12 Python
Python计算程序运行时间的方法
Dec 13 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
Python设计模式之观察者模式简单示例
Jan 10 Python
Python面向对象类继承和组合实例分析
May 28 Python
Python提取频域特征知识点浅析
Mar 04 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 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
linux下 C语言对 php 扩展
2008/12/14 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
如何实现JS函数的重载
2006/09/22 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
Angular的MVC和作用域
2016/12/26 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
react build 后打包发布总结
2018/08/24 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
python处理按钮消息的实例详解
2017/07/11 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
python 搜索大文件的实例代码
2019/07/08 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
质检部部长职责
2013/12/16 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
工作分析计划书
2014/04/30 职场文书
网站出售协议书范文
2014/10/10 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang