[置顶] [3]Python学习笔记---写一个Python程序把CSDN专栏的所有文章另存为本地网页

标签: python构造函数csdn
350人阅读 评论(2) 收藏 举报
分类:

了解和学习了Python已经有一小段时间了,是应该写一个程序出来练练手了。 我们知道Python里面有很多的第三方库,而且也支持面向对象的编程思想。作为一个从事了Java编码工作快10年的程序员来说,应该不难理解和使用其面向对象的思想。下面就以把我的PowerShell DSC专栏里面所有的文章下载到本地为例子,看用Python如何简单。

代码如下,

import urllib.request
from bs4 import BeautifulSoup
import os
class CSDNSpecialTopic():
    def __init__(self,sepcialTopicIndexURLs=[],rootFolder="c:/test/"):
        self.sepcialTopicIndexURLs=sepcialTopicIndexURLs
        self.rootFolder=rootFolder

    def openURLAndSave(self):
        csdnList,csdnDic=self.getCSDNSpecialTopicPages()
        for title,tempPageURL in csdnDic.items():
            html = urllib.request.urlopen(tempPageURL)
            s=html.read()
            if not os.path.exists(self.rootFolder):
                os.mkdir(self.rootFolder)
            outfile = open(self.rootFolder+ "/"+ title+".html", "wb")
            outfile.write(s)
            outfile.close()

    def getCSDNSpecialTopicPages(self):
        csdnList = []
        csdnDic = {}
        for sepcialTopicIndexURL in self.sepcialTopicIndexURLs:
            f = urllib.request.urlopen(sepcialTopicIndexURL)
            htmlstr = f.read().decode('utf-8')
            soup = BeautifulSoup(htmlstr)
            h4s = soup.findAll('h4')
            for h4 in h4s:
                href = h4.a
                if href is not None:
                    if href.get("href") is not None:
                        csdnList.append(href.get("href"))
                        csdnDic[href.get_text()] = href.get("href")
        print(len(csdnList))
        print(len(csdnDic))
        print(csdnDic,sep='\n')
        return csdnList,csdnDic

sepcialTopicIndexURLs=["http://blog.csdn.net/column/details/14191.html","http://blog.csdn.net/column/details/14191.html?&page=2"];
csdnSpecialTopic=CSDNSpecialTopic(sepcialTopicIndexURLs,"c:/test3")
csdnList,csdnDic=csdnSpecialTopic.getCSDNSpecialTopicPages()
csdnSpecialTopic.openURLAndSave()

其中使用了urllib第三方库进行http的访问,使用bs4中的BeautifulSoup 类来进行HTML页面的解析。

先对urllib库做一个简单的描述。

  • 第一种是get请求    
方式一:urllib.request.urlopen(url)    
方式二:先创建一个urllib.request.Request对象,然后将对象放入urlopen中。urllib.request.urlopen(Request对象)

  • 第二种是POST:

携带数据过去    比如:登录用户名,密码    先创建一个urllib.request.Request    
将请求数据放到Request对象中urllib.request.Request(url,data)    
注意:在此之前先将data进行转化:       
data = urllib.parse.urlencode(values)

  • 第三种是:添加请求头

比如:headers = {'User-Agent':user_agent} 然后把headers放到Request方法的第三个参数

urllib.request.Request(url, data.encode("utf-8"), headers)


下面是从网上找的一个简单的例子。

import urllib.parse
import urllib.request


url = "http://www.baidu.com"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python'}
headers = {'User-Agent':user_agent}


data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data.encode("utf-8"), headers)
response = urllib.request.urlopen(req)
the_page = response.read().decode("utf-8")
print(the_page)


基础讲完了,下面到具体的例子,CSDNSpecialTopic是我定义的一个类,里面提供了访问网页,解析网页和把网页另存为的功能。其接受两个参数:一个数组,专栏的URL地址,可以有多个;另外一个就是网页文件需要存放的目录,如果当前没有这个目录,就创建一个新的目录。这两个参数是通过其构造函数:

def __init__(self,sepcialTopicIndexURLs=[],rootFolder="c:/test/"):
传入进来的,默认的路径是c:/test文件夹。

下面是运行的结果,其很好的支持中文。





1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:387463次
    • 积分:6367
    • 等级:
    • 排名:第4111名
    • 原创:228篇
    • 转载:0篇
    • 译文:5篇
    • 评论:157条
    博客专栏