爬取博主的所有文章的标题、链接和内容

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

效果:

 打开.txt:

猜你喜欢

转载自www.cnblogs.com/Mr-choa/p/12619398.html