python:爬取博主的所有文章的鏈接、標題和內容


以爬取我自己的博客為例: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)
View Code

效果:

 打開.txt:

 

參考博客:https://www.cnblogs.com/xingzhui/p/7845675.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM