zoukankan      html  css  js  c++  java
  • 爬取博主所有文章并保存到本地(.txt版)--python3.6

    闲话:

    一位前辈告诉我大学期间要好好维护自己的博客,在博客园发布很好,但是自己最好也保留一个备份。

    正好最近在学习python,刚刚从py2转到py3,还有点不是很习惯,正想着多练习,于是萌生了这个想法——用爬虫保存自己的所有文章

    在查了一些资料后,慢慢的有了思路。

    正文:

    有了上面的思路后,编程就不是问题了,就像师傅说的,任何语言,语法只是很小的一部分,主要还是编程思想。于是边看语法,边写程序,照葫芦画瓢,也算实现了既定的功能:

    1、现在py文件同目录下创建一个以博主名字为名的文件夹,用来存放爬取的所有文章。

    2、暂时先保存成TXT文件,这个比较容易。但是缺点是无法保存图片。后面在学习直接转成PDF。

    3、爬取完成后提醒我你爬取了多少片文章。

    要懒就懒到位,最好不要让我动一下手就自动爬取所有文章,但是。。。。还是要看一下自己的文章目录的url吧、看一下自己有多少页目录吧,然后这两个参数填进去之后,就完美了。

    提示:使用chrome浏览器,在chrome下:先按F12进入开发者模式,在网页上右键选中一块区域,然后选择【检查】,在右侧即可查看对应的HTML程序

    主要函数的实现:

    1、获取所有文章的url:

    def get_urls(url,pages):
        """
        获取所有目录下的所有文章url
        :param url: 某一页目录的url,去掉最后的数字
        :param pages: 一共需要爬取的页数
        :return: 返回所有文章url的列表
        """
        total_urls = []
    
        for i in range(1,pages+1):      #根据一个目录的url找到所有目录
    
            url_temp = url + str(i)
    
            html = get_html(url_temp)   #获取网页源码
    
            title_pattern = re.compile(r'<a.*?class="postTitle2".*?href="(.*?)">',re.S)    #文章url正则表达式
    
            url_temp2 = re.findall(title_pattern,html)     #找到一个目录中所有文章的网址
    
            for _url in url_temp2:
                total_urls.append(_url)            #所有文章url放在一起
        return total_urls

    关于正则表达式的选择:这是我目录中的两篇文章标题的HTML程序:

    可以发现,都在一对a标签下,class属性为:"postTitle n",其href属性就是文章的url网址。

    所以正则表达式可以写为:re.compile(r'<a.*?class="postTitle2".*?href="(.*?)">',re.S)

    最后调用append方法,将所有文章的url放在一个list列表里面。

    2、获取文章标题:

    def get_title(url):
        """
        获取对应url下文章的标题,返回标题
        :param url:
        :return:
        """
        html_page = get_html(url)
        title_pattern = re.compile(r'(<a.*id="cb_post_title_url".*>)(.*)(</a>)')
        title_match = re.search(title_pattern,html_page)
        title = title_match.group(2)
        return title

    这个也很简单,检查元素我们可以发现:

    与上面一样,这个正则表达式可以选择:re.compile(r'(<a.*id="cb_post_title_url".*>)(.*)(</a>)')

    然后保留其第二个分组就是文章标题。

    3、获取正文:

    def get_body(url):
        """
        获取url下文章的正文内容
        :param url:
        :return:
        """
        html_page = get_html(url)
        soup = BeautifulSoup(html_page,'html.parser')   #HTML文档解析器
        div = soup.find(id = "cnblogs_post_body")
        return div.get_text()

    使用BeautifulSoup模块,创建一个对象,然后使用  soup.find()方法,搜索ID为  "cnblogs_post_body" 的标签,返回标签内的文档内容。

    4、下载单个文件:

    def save_single_file(url):
        """
        首先在py文件同目录下创建一个以博主名字为名的文件,用来存放爬取的所有文章
        将文章正文保存在txt文件中,名字为文章标题
        有些文章的标题可能不适合直接作为txt文件名,我们可以忽略这些文章
        :param url:
        :return:
        """
        global article_count    #使用全局变量,需要在函数中进行标识
        title = get_title(url)
        body = get_body(url)
    
        #获取当前目录文件,截取目录后,并自动创建文件
        FILE_PATH = os.getcwd()[:-0]+author+'_''text\'
        if not os.path.exists(FILE_PATH):
            os.makedirs(FILE_PATH)
    
        try:
            filename = title + '.txt'
            with open('D:learning pythoncoding_python3.6cnblog\Andrew_text\'+filename,'w',encoding='utf-8') as f:
                f.write(body)       #正文写入文件
                article_count+= 1   #计数变量加1,统计总的下载文件数
        except:
            pass
    
        print(title+"  file have saved...")     #提示文章下载完毕

    对于 os.getcwd()方法,

    如果a.py文件存放的路径下为:D:AutoeclipseworkspaceTesthtmlTest

    通过os.getcwd()获取的路径为:D:AutoeclipseworkspaceTesthtmlTest

    使用os.getcwd()[:-4]截取到的路径为:D:AutoeclipseworkspaceTesthtml ,注意这个-4是在当前目录字符串下,向前截取4个字符后的目录。不想截取的话,直接省略数字,但是要有  [:]

    使用下面的命令则在3步骤下新建文件夹,名为:变量author_text

        #获取当前目录文件,截取目录后,并自动创建文件
        FILE_PATH = os.getcwd()[:-0]+author+'_''text\'
        if not os.path.exists(FILE_PATH):
            os.makedirs(FILE_PATH)

     5、最终下载:

    def save_files(url,pages):
        """
        调用单个文件保存函数,循环保存所有文件
        :param url:传入任意一个目录的url,但是要注意去掉最后的数字。
        :return:
        """
        total_urls = get_urls(url,pages)
        print("get all the urls..."+'
    ')
        print(total_urls)      #获取的文章url正确
    
        for urls in total_urls:
             save_single_file(urls)
    
        #输出下载的总文章数
        print('
    ' + "total article count is :%d"%article_count)

     运行结果:

    参考资料:

    项目启发:http://www.cnblogs.com/xingzhui/p/7881905.html

    正则表达式:https://blog.csdn.net/qq_878799579/article/details/72887612

  • 相关阅读:
    uml系列(四)——类图
    Linux设备驱动实现自己主动创建设备节点
    收集了三年的最好的设计站点
    CoInitialize浅析一
    iOS 单例
    Android开发之异步具体解释(二)之AsyncTask
    ComboBox控件
    下拉框Html.DropDownList 和DropDownListFor 的经常用法
    好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can&#39;t be established. 的问题
    cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
  • 原文地址:https://www.cnblogs.com/qsyll0916/p/8677151.html
Copyright © 2011-2022 走看看