以爬取我自己的博客為例: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)
# 發起請求,urlopen返回的是一個HTTPResponse對象
resp = urllib.request.urlopen(req)
# 獲取HTTP源代碼,編碼格式為utf-8
html_page = resp.read().decode('utf-8')
# 返回網頁源碼
return html_page
或者用requests庫實現:
def get_html(url): # 創建一個響應對象
response=requests.get(url) # 獲取整個網頁的HTML內容
html_page=response.text # 返回網頁的HTML內容
return html_page
3、獲取博客文章的標題
代碼實現:
# 獲取博客文章的標題
def get_title(url):
'''
獲取對應url下文章的標題
:param url:
:return:
'''
# 通過博文的地址獲取到源代碼
html_page = get_html(url)
# 創建str變量
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 requests 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) # 發起請求,urlopen返回的是一個HTTPResponse對象 resp = urllib.request.urlopen(req) # 獲取HTTP源代碼,編碼格式為utf-8 html_page = resp.read().decode('utf-8') # 返回網頁源碼 return html_page '''# 獲取網頁源代碼 def get_html(url): # 創建一個響應對象 response=requests.get(url) # 獲取整個網頁的HTML內容 html_page=response.text # 返回網頁的HTML內容 return html_page ''' # 獲取博客文章的標題 def get_title(url): ''' 獲取對應url下文章的標題 :param url: :return: ''' # 通過博文的地址獲取到源代碼 html_page = get_html(url) # 創建str變量 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) # 創建對象,基於bs4庫HTML的格式輸出 soup = BeautifulSoup(html_page, 'html.parser') # 定義一個soup進行find()方法處理的標簽 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: