CSDN博客专栏文章批量下载脚本[python实现]

摘要:
最近,我发现CSDN的博客专栏非常棒。毕竟,这是一系列文章。学习一些知识很容易形成一个系统,前人的经验相当宝贵。除了最近看书,我还会看别人的专栏。尽管你能看或不能看,文章就在那里,但当我无法上网时,它仍然很痛苦。我花了一个小时写一个python脚本。我只需要在列列表中填写页面的url,即可结束整个列。目前,win7+py2.7已经通过测试。它需要有一个python环境。Linux学生需要通过dos 2unix进行处理。

    最近发现CSDN的blog专栏还是很给力的,毕竟这是一整个系列的文章,学习某方面知识比较容易形成体系,而且前人的经验还是相当有参考价值的。

    原先也开了两个,只是工作比较忙,加之lz比较懒,所以没啥人气,囧。

    最近看书之余,也会去看看别人的专栏,虽然你看或不看,文章就在那里,但是不能上网的时候还是很蛋疼的


    so,花了一个小时,写了个python脚本,只需要填下专栏文章列表某一页url【注意不是文章页面,是列表页面】,就能将整个专栏文章端下来。

    分享之,想下整个系列文章的同学动手吧。

   

    目前在win7 + py2.7测试通过,要有python环境哈,linux的同学需dos2unix处理下。

    木有python环境的,下个吧,2.7,装一下很快的http://www.python.org/

    PS.有很多坑,但是下大部分专栏还是没问题的(譬如文件名存在非法字符暂未处理),没异常处理,都怎么简单怎么来

    发现坑的话希望能发我,逐步改进,后续有空的话搞掉python环境依赖&增加图形界面

--------------------------------------------------------------------------------------------------

实现思路:

1.到专栏列表页,正则匹配到最后一页的url

2.生成每页url列表,从第一页到最后一页的url

3.抓每一页,正则匹配到列表页里面文章标题和文章地址

4.下载之

木有python的同学可以用其他语言搞下

---------------------------------------------------------------------------------------------------

使用方法:

1.打开专栏的列表页面,拉到url

例如:http://blog.csdn.net/column/details/wklken4linux.html

图示1:不带页码的(文章太少,就是所有文章列表都木有翻页),以下这个是lz的,o(╯□╰)o

CSDN博客专栏文章批量下载脚本[python实现]第1张

图示2:带页码的  (文章很多,分页了,放心,随便哪页都行,整个系列全端下来)

CSDN博客专栏文章批量下载脚本[python实现]第2张

2.复制url,修改脚本里line 68行,修改first_url变量


3.开始->运行->cmd 

cd到脚本所在位置

有配置环境变量的,直接 python download_column.py

没有配置环境变量的,使用 C:\Python27\python.exe download_column.py   【这里路径是装环境时的】


4.过程图:

CSDN博客专栏文章批量下载脚本[python实现]第3张


5.结果:

CSDN博客专栏文章批量下载脚本[python实现]第4张

CSDN博客专栏文章批量下载脚本[python实现]第5张



#version 0.1 基本功能

  下载地址:  http://www.kuaipan.cn/file/id_43019534898112640.html

#version 0.2  A.修复下载文章中存在非法字符bug B.独立函数,可以批量配置下载C.已下载不会二次下载

  下载地址:http://www.kuaipan.cn/file/id_43019534898113708.html


配了一堆,下完了,甚是壮观.................

附上脚本源码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#@Author: wklken
#@Mail: wklken@yeah.net
#@Date: 20120807
#@version 0.1
#@desc: base function to download csdn column!


print "begin...."

import urllib2,socket
import re
import os,sys

#该页最后一个中文链接,尾页
p2first = re.compile(ur'下一页</a> <a href="http://t.zoukankan.com/(.*?)">尾页</a>') #html?page=\d+

p2detail = re.compile(ur'<a name="\d+" href="http://t.zoukankan.com/(.*?)" target="_blank">(.*)</a>')

p2title = re.compile(ur'<title>专栏:(.*) - 博客频道 - CSDN.NET</title>')

p2titlereplace = re.compile(r'[\/:*?"<>|]')

def find_url_prefix_maxpage_title(content):
    title = p2title.findall(content,re.X)
    l =  p2first.findall(content,re.X)
    if l and len(l[0].split("=")) == 2:  #存在多页
       return True,l[0].split("="),title[0]
    else:
       return False,(None,None),title[0]

def get_request(url):
    #设置超时  
    socket.setdefaulttimeout(60)  
    #可以加入请求头信息,以便识别
    i_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",  
                "Accept": "text/plain"}   
    req = urllib2.Request(url, headers=i_headers)  
    content = ""
    try:  
        page = urllib2.urlopen(req) 
        #print page.geturl()
        #print page.info().getplist()
        content =  page.read().decode("utf-8")
    except urllib2.HTTPError, e:  
        print "Error Code:", e.code  
    except urllib2.URLError, e:  
        print "Error Reason:", e.reason 
    return content

def gen_urls(url_prefix, max_page):
    for i in range(1,max_page+1):
        yield url_prefix + "=" + str(i)

def download_pages(url, dir_path):
    content = get_request(url)
    l =  p2detail.findall(content,re.X)
    #print l,len(l),l[0]
    for (detail_url, title) in l:
        print "Downloading: ",title,detail_url
        title, num = p2titlereplace.subn("-",title)
        path = dir_path + os.sep + title + ".html"
        if not os.path.exists(path): #只下载新文章,不过老文章修改无法下到,要想全部更新,可以去掉if
            f = open(path,"w")
            f.write(get_request(detail_url).encode("utf-8"))
            f.close()

def get_down(first_url):
    content = get_request(first_url)
    multi_page,(url_prefix, max_apge), title =  find_url_prefix_maxpage_title(content) 

    print title
    title, num = p2titlereplace.subn("-",title)
    dir_path = "./"+title
    if not os.path.exists(dir_path):
        os.mkdir(dir_path)

    if multi_page:
        for url in gen_urls(url_prefix, int(max_apge)):
            print url
            download_pages("http://blog.csdn.net" + url, dir_path)
    else:
        download_pages(first_url, dir_path)    



if __name__ == '__main__':
    #first_url = "http://blog.csdn.net/column/details/novelnorains.html?page=4"
    # first_url = "http://blog.csdn.net/column/details/wklken4ds-alg-py.html"
    # get_down(first_url)
    # sys.exit(0)

    urls = [
    "http://blog.csdn.net/column/details/wklken4ds-alg-py.html", #数据结构和算法python实现,未完
    "http://blog.csdn.net/column/details/wklken4linux.html", #linux新手生存笔记,未完
    ]
    for first_url in urls:
        get_down(first_url)


就这些

懒得动了,歇了


wklken

2012-08-07

http://wklken.sinaapp.com/



免责声明:文章转载自《CSDN博客专栏文章批量下载脚本[python实现]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微软Azure云计算服务主导全球Android 命令行编译、打包生成apk文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

基于Python的Web应用开发实战——3 Web表单

第2章中介绍的 请求对象 包含客户端发出的所有请求信息。 其中, request.form 能获取 POST请求 中提交的表单数据。 尽管Flask的请求对象提供的信息足够用于处理Web表单,但有些任务很单调,而且要重复操作。 比如,生成表单的HTML代码和验证提交的表单数据。 Flask-WTF(https://flask-wtf.readthedocs...

PyQt(Python+Qt)学习随笔:QWidget部件的palette属性以及ColorGroup、colorRole的用途和含义

专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 1、palette属性 QWidget部件的palette属性用于控制部件不同部分的颜色设置。 在Qt Designer的部件属性中,有个部件调色板(palette)的属性,进入后,如下图所示: Qt中提供的调色板pale...

web前端学习笔记(CSS固定宽度布局)

一、单列布局:       这是最简单的一种布局方式,之所以给出该示例,还是为了保证本篇博客的完整性。 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>固定宽度布局</title> <style type="text/css"&g...

Python 基础(二)

一、def 函数 python 提供了函数功能,可以将想要在程序中重复使用的部分功能抽象成一个函数,以方便程序调用,或者提供给其他模块使用 def function_name(parameters): expressions python 使用 def 开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的具体功能实现代码,如果想要函数有...

Python 多线程与多进程的性能分析

1、多进程多进程: 优点:可以利用多核优势 缺点:开销大 2 、多线程: 优点:开销小 缺点:不能利用多核优势 3、结论:计算密集型可以选择多进程,IO密集型可以选择多线程 from threading import Thread from multiprocessing import Process import time #计算密集型 def work...

权限模块设计及使用

最近一直在做权限那一块,越做越乱,有很多疑问,想和大家探讨交流。希望大家不吝赐教、 1、项目用的是spring security框架,在用这个框架的时候,配置文件的配置就花了很长时间,然后就是将项目中的所有url都进行控制,输入数据库或配到配置文件中。 2、在做的时候,出现了分歧,老大的意思是只控制到菜单级别,有权限就可以看到菜单,没权限就不能看到菜单。但...