以爬取我自己的博客为例:https://www.cnblogs.com/Mr-choa/
1、获取所有的文章的链接:
博客文章总共占两页,比如打开第一页:https://www.cnblogs.com/Mr-choa/default.html?page=1的HTML源文件
每篇博客文章的链接都在a标签下,并且具有class属性为"postTitle2",其href属性就指向这篇博文的地址
<a class="postTitle2" href="https://www.cnblogs.com/Mr-choa/p/12615986.html">
简单爬取自己的一篇博客文章
</a>
这样我们可以通过正则表达式获取博文的地址,获取所有的文章的链接就要对博客的页数做一个遍历:
模块代码实现:
# 获取所有的链接 def get_Urls(url,pageNo): """ 根据url,pageNo,能够返回该博主所有的文章url列表 :param url: :param pageNo: :return: """ # 创建一个list,用来装博客文章的地址 total_urls=[] # 对页数做个遍历 for i in range(1,pageNo+1): # 页数的地址 url_1=url+str(i) # 获取这一页的全部源代码 html=get_html(url_1) # 创建一个属性 title_pattern=r'<a.*class="postTitle2".*href="(.*)">' # 通过正则表达式找到所有相关属性的数据,就是所有的博客文章的链接 urls=re.findall(title_pattern,html) # 把链接放到list容器内 for url_ in urls: total_urls.append(url_) #print(total_urls.__len__()) # 返回所有博客文章的链接 return total_urls
2、获取全部源代码
代码实现:
def get_html(url): """ 返回对应url的网页源码,经过解码的内容 :param url: :return: """ req = urllib.request.Request(url) resp = urllib.request.urlopen(req) html_page = resp.read().decode('utf-8') return html_page
3、获取博客文章的标题
代码实现:
# 获取博客文章的标题 def get_title(url): ''' 获取对应url下文章的标题 :param url: :return: ''' html_page = get_html(url) title_pattern = r'(<a.*id="cb_post_title_url".*>)(.*)(</a>)' title_match = re.search(title_pattern, html_page) title = title_match.group(2) return title
4、获取博客文章的所有文本
代码实现:
# 获取博客文章的文本 def get_Body(url): """ 获取对应url的文章的正文内容 :param url: :return: """ html_page = get_html(url) soup = BeautifulSoup(html_page, 'html.parser') div = soup.find(id="cnblogs_post_body") return div.text
5、保存文章
代码实现:
# 保存文章 def save_file(url): """ 根据url,将文章保存到本地 :param url: :return: """ title=get_title(url) body=get_Body(url) filename="Mr_choa"+'-'+title+'.txt' with open(filename, 'w', encoding='utf-8') as f: f.write(title) f.write(url) f.write(body) # 遍历所有的博客文章链接,保存博客的文章 def save_files(url,pageNo): ''' 根据url和pageNo,保存博主所有的文章 :param url: :param pageNo: :return: ''' totol_urls=get_Urls(url,pageNo) for url_ in totol_urls: save_file(url_)
展示所有的代码:
import urllib.request import re from bs4 import BeautifulSoup #该作者的博文一共有多少页 pageNo=2 #后面需要添加页码 url='https://www.cnblogs.com/Mr-choa/default.html?page=' # 获取网页源码 def get_html(url): """ 返回对应url的网页源码,经过解码的内容 :param url: :return: """ req = urllib.request.Request(url) resp = urllib.request.urlopen(req) html_page = resp.read().decode('utf-8') return html_page # 获取博客文章的标题 def get_title(url): ''' 获取对应url下文章的标题 :param url: :return: ''' html_page = get_html(url) title_pattern = r'(<a.*id="cb_post_title_url".*>)(.*)(</a>)' title_match = re.search(title_pattern, html_page) title = title_match.group(2) return title # 获取博客文章的文本 def get_Body(url): """ 获取对应url的文章的正文内容 :param url: :return: """ html_page = get_html(url) soup = BeautifulSoup(html_page, 'html.parser') div = soup.find(id="cnblogs_post_body") return div.text # 保存文章 def save_file(url): """ 根据url,将文章保存到本地 :param url: :return: """ title=get_title(url) body=get_Body(url) filename="Mr_choa"+'-'+title+'.txt' with open(filename, 'w', encoding='utf-8') as f: f.write(title) f.write(url) f.write(body) # 遍历所有的博客文章链接,保存博客的文章 def save_files(url,pageNo): ''' 根据url和pageNo,保存博主所有的文章 :param url: :param pageNo: :return: ''' totol_urls=get_Urls(url,pageNo) for url_ in totol_urls: save_file(url_) # 获取所有的链接 def get_Urls(url,pageNo): """ 根据url,pageNo,能够返回该博主所有的文章url列表 :param url: :param pageNo: :return: """ # 创建一个list,用来装博客文章的地址 total_urls=[] # 对页数做个遍历 for i in range(1,pageNo+1): # 页数的地址 url_1=url+str(i) # 获取这一页的全部源代码 html=get_html(url_1) # 创建一个属性 title_pattern=r'<a.*class="postTitle2".*href="(.*)">' # 通过正则表达式找到所有相关属性的数据,就是所有的博客文章的链接 urls=re.findall(title_pattern,html) # 把链接放到list容器内 for url_ in urls: total_urls.append(url_) #print(total_urls.__len__()) # 返回所有博客文章的链接 return total_urls save_files(url,pageNo)
效果:
打开.txt: