闲话:

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

正好最近在学习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 python\coding_python3.6\cnblog\\Andrew_text\\'+filename,'w',encoding='utf-8') as f:f.write(body)       #正文写入文件article_count+= 1   #计数变量加1,统计总的下载文件数except:passprint(title+"  file have saved...")     #提示文章下载完毕

对于 os.getcwd()方法,

如果a.py文件存放的路径下为:D:\Auto\eclipse\workspace\Testhtml\Test

通过os.getcwd()获取的路径为:D:\Auto\eclipse\workspace\Testhtml\Test

使用os.getcwd()[:-4]截取到的路径为:D:\Auto\eclipse\workspace\Testhtml\ ,注意这个-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..."+'\n')print(total_urls)      #获取的文章url正确for urls in total_urls:save_single_file(urls)#输出下载的总文章数print('\n' + "total article count is :%d"%article_count)

运行结果:

参考资料:

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

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

转载于:https://www.cnblogs.com/qsyll0916/p/8677151.html

爬取博主所有文章并保存到本地(.txt版)--python3.6相关推荐

  1. python爬取文章保存_爬取博主所有文章并保存到本地(.txt版)--python3.6

    闲话: 一位前辈告诉我大学期间要好好维护自己的博客,在博客园发布很好,但是自己最好也保留一个备份. 正好最近在学习python,刚刚从py2转到py3,还有点不是很习惯,正想着多练习,于是萌生了这个想 ...

  2. python爬取文章保存为txt_爬取博主所有文章并保存到本地(.txt版)--python3.6

    闲话: 一位前辈告诉我大学期间要好好维护自己的博客,在博客园发布很好,但是自己最好也保留一个备份. 正好最近在学习python,刚刚从py2转到py3,还有点不是很习惯,正想着多练习,于是萌生了这个想 ...

  3. (Java篇)爬取微信公众号文章并保存为 PDF 格式

    前言 背景: 某一天,拿着自己的手机看着技术文章,然而手机看技术文章,有时候确实蛋疼,因为一旦代码多起来,小屏幕看的还是眼花:又或者某一天觉得这一篇文章,觉得写的很棒棒哦,于是先收藏,打算过几天看,然 ...

  4. python爬取正确但不出文件_使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...

    前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...

  5. 备忘3:爬取博主热门信息以及所有热门微博的点赞的用户信息

    import requests import os import re import csv import time import json#headers是请求加上头信息,伪装成浏览器访问,不然会被 ...

  6. python 教程 w3 school_python爬取w3shcool的JQuery课程并且保存到本地

    最近在忙于找工作,闲暇之余,也找点爬虫项目练练手,写写代码,知道自己是个菜鸟,但是要多加练习,书山有路勤为径.各位爷有测试坑可以给我介绍个啊,自动化,功能,接口都可以做. 首先呢,我们明确需求,很多同 ...

  7. Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件

    Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...

  8. Python网络爬虫:爬取CSDN热搜数据 并保存到本地文件中

    hello,大家好,我是wangzirui32,今天我们来学习如何爬取CSDN热搜数据,并保存到Excel表格中. 开始学习吧! 学习目录 1. 数据包抓取 2. 编写代码 1. 数据包抓取 打开CS ...

  9. python save保存图片到本地_python爬取网站上的图片并保存到本地

    1.导入需要的模块requests,BeautifulSoup,os(用于文件读写). 2.创建一个类,并初始化. class BeautifulPicture: def __init__(self) ...

最新文章

  1. Jar/War/Ear等包的作用与区别详解
  2. Linux系统基础调优
  3. linux 系统 权限
  4. Angular变化检测机制:改善的脏检查
  5. apache支持mysql ubuntu_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
  6. WPF如何为程序添加splashScreen(初始屏幕)
  7. 华为认证、华三认证、思科认证考哪个好?
  8. 国家电网与百度达成战略合作,在智慧能源领域掀起新基建热潮
  9. Linux一句话精彩问答-网络无关篇
  10. 用123 组成的6位数 的java代码,输入一个三位的整数,计算其每位数字的累加之和。例如:输入整数123后,其每位数字累加之和为6(1+2+3),感激不尽...
  11. 如何获取HanLP的nature中文名
  12. 计算机网络配置——静态路由的配置
  13. word删除页眉下面的横线
  14. 小白也能通俗易懂的联邦学习!
  15. CentOS7 搭建虚拟主机
  16. 数据处理:1 用pandas处理大型csv文件 2 使用Pandas分块处理大文件 3 分块读取
  17. 怎么把视频转换成mp3格式?
  18. 福州python招聘_东南网2017招聘启事
  19. 智慧农业总体实施方案
  20. 【相机标定基于消失点的外参标定】

热门文章

  1. iOS9系列专题三——应用瘦身
  2. BAT-使用BAT方法清理Delphi临时文件
  3. 【网络基础】《TCP/IP详解》学习笔记4
  4. 使用Ant制作发布版本
  5. elm的 java包_README.md
  6. string字符串数字自增_常见的字符串操作
  7. print输出保存到txt
  8. 去中心化无险永续合约Shield即将在以太坊-Kovan网络发布测试活动
  9. 今日恐慌与贪婪指数为78 贪婪程度与昨日持平
  10. 24小时BTC合约大单成交1.43亿美元 现货大单成交2.08亿美元