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 时间处理datetime实例
Sep 06 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python 基于opencv实现高斯平滑
Dec 18 Python
Python多线程 Queue 模块常见用法
Jul 04 Python
python文件与路径操作神器 pathlib
Apr 01 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
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
JQuery与iframe交互实现代码
2009/12/24 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
javascript获取下拉列表框当中的文本值示例代码
2013/07/31 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
python实现壁纸批量下载代码实例
2018/01/25 Python
python实现Decorator模式实例代码
2018/02/09 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
Python datetime 如何处理时区信息
2020/09/02 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
电子商务应届生求职信
2013/11/16 职场文书
企划专员岗位职责
2013/12/09 职场文书
决心书标准格式
2014/03/11 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
教师评语大全
2014/04/28 职场文书
个人承诺书怎么写
2014/05/24 职场文书
导游欢迎词范文
2015/01/23 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android