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 切片和range()用法说明
Mar 24 Python
跟老齐学Python之编写类之一创建实例
Oct 11 Python
Python中利用函数装饰器实现备忘功能
Mar 30 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python如何爬取个性签名
Jun 19 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
python中selenium操作下拉滚动条的几种方法汇总
Jul 14 Python
Python常用模块函数代码汇总解析
Aug 31 Python
Python基础详解之描述符
Apr 28 Python
浅谈Python数学建模之固定费用问题
Jun 23 Python
Pygame Draw绘图函数的具体使用
Nov 17 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
js实现图片360度旋转
2017/01/22 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
JS实现图片拖拽交换效果
2018/11/30 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
以windows service方式运行Python程序的方法
2015/06/03 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
Python实现的knn算法示例
2018/06/14 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
如何实现Django Rest framework版本控制
2019/07/25 Python
python如何实现图片压缩
2020/09/11 Python
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
北京某公司的.net笔试题
2014/03/20 面试题
手机业务员岗位职责
2013/12/13 职场文书
销售主管岗位职责
2014/02/08 职场文书
《秋游》教学反思
2014/04/24 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
一篇文章弄懂Python中的内建函数
2021/08/07 Python
Elasticsearch 数据类型及管理
2022/04/19 Python