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多线程threading.Lock锁用法实例
Nov 01 Python
Python解析nginx日志文件
May 11 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
详解Python的Lambda函数与排序
Oct 25 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
python仿抖音表白神器
Apr 08 Python
pygame实现成语填空游戏
Oct 29 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python列表操作方法详解
Feb 09 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Python 文本滚动播放器的实现代码
Apr 25 Python
python+opencv实现视频抽帧示例代码
Jun 11 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+MYSQL会员系统的开发实例教程
2014/08/23 PHP
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
python使用urllib2提交http post请求的方法
2015/05/26 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
高三自我鉴定范文
2013/10/19 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
税务会计岗位职责
2015/04/02 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
实习感想范文
2015/08/10 职场文书
详解Python中的for循环
2022/04/30 Python