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

闲话:

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

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

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

正文:

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

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

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

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

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

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

主要函数的实现:

1、获取所有文章的url:

defget_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'',re.S) #文章url正则表达式

url_temp2= re.findall(title_pattern,html) #找到一个目录中所有文章的网址

for _url inurl_temp2:

total_urls.append(_url)#所有文章url放在一起

return total_urls

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

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

所以正则表达式可以写为:re.compile(r'',re.S)

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

2、获取文章标题:

defget_title(url):"""获取对应url下文章的标题,返回标题

:param url:

:return:"""html_page=get_html(url)

title_pattern= re.compile(r'()(.*)()')

title_match=re.search(title_pattern,html_page)

title= title_match.group(2)return title

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

与上面一样,这个正则表达式可以选择:re.compile(r'()(.*)()')

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

3、获取正文:

defget_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、下载单个文件:

defsave_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 notos.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:pass

print(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 notos.path.exists(FILE_PATH):

os.makedirs(FILE_PATH)

5、最终下载:

defsave_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 intotal_urls:

save_single_file(urls)#输出下载的总文章数

print('\n' + "total article count is :%d"%article_count)

运行结果:

参考资料:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用多种方式来爬取网页上的图片并将其保存到本地。通常,这个过程会涉及以下几个步骤: 1. 使用requests库获取网页内容。 2. 解析网页内容,找到图片的URL。 3. 再次使用requests库下载图片。 4. 将下载的图片保存到本地文件系统。 以下是一个简单的示例代码,演示了如何实现这个过程: ```python import requests from bs4 import BeautifulSoup # 定义保存图片的函数 def save_image(image_url, local_path): response = requests.get(image_url) if response.status_code == 200: with open(local_path, 'wb') as f: f.write(response.content) print(f"图片已保存到:{local_path}") else: print("图片下载失败") # 目标网页URL url = 'http://example.com/' # 发送HTTP求获取网页内容 response = requests.get(url) # 使用BeautifulSoup解析HTML soup = BeautifulSoup(response.text, 'html.parser') # 查找所有图片标签 images = soup.find_all('img') # 定义图片保存的本地路径前缀 local_folder = 'downloaded_images/' # 遍历所有图片标签 for img in images: # 获取图片的URL img_url = img.get('src') # 如果图片URL是完整的URL,则直接使用;否则,拼接完整路径 if not img_url.startswith('http'): img_url = url + img_url # 定义图片的本地保存路径 img_name = local_folder + img_url.split('/')[-1] # 调用保存图片的函数 save_image(img_url, img_name) ``` 这段代码首先定义了一个`save_image`函数,用于下载图片并保存到本地。然后通过requests库获取网页内容,并用BeautifulSoup解析HTML内容,找到所有图片标签并提取出图片的URL。最后,将每个图片下载并保存到本地路径。 注意,这只是一个基础示例,实际应用中可能需要处理更多的异常情况,比如网络求失败、图片URL不完整或无法访问等。此外,还需要确保遵守网站的robots.txt规则和权法律,不要非法爬取和使用网络资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值