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提取内容关键词的方法
Mar 16 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
Django返回json数据用法示例
Sep 18 Python
python使用sqlite3时游标使用方法
Mar 13 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
wxPython的安装与使用教程
Aug 31 Python
python 中的[:-1]和[::-1]的具体使用
Feb 13 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
Python logging模块写入中文出现乱码
May 21 Python
python实现逻辑回归的示例
Oct 09 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 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中使用memcache存储session的三种配置方法
2014/04/05 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
python编程开发之日期操作实例分析
2015/11/13 Python
浅谈Python的文件类型
2016/05/30 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
一套.net面试题及答案
2016/11/02 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
建筑工地标语
2014/06/18 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
新教师教学工作总结
2015/08/12 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
Java实现多线程聊天室
2021/06/26 Java/Android