CSDN文章爬取前十博主文章并转换为md

CSDN爬取

python+selenium+parsel+tomd

tansty创建

代码地址:
github
gitee


## 一、所需知识 ***1.parsel模块基本知识***

(1)CSS选择器
需要先创建一个parsel.Selector对象
from parsel import Selector
html 可以是请求某个网页的源码,也可以是html,xml格式的字符串
selector = Selector(html)
创建Selector对象之后就可以开始使用了
tags = selector.css(’.content’)
我们平时使用的css中,对某一个标签进行修饰时,使用的是 .class_attr
在这里也是如此
.content 就是指查询所有 class 为 content 的标签
查询的结果是一个特殊的对象,不能直接得到需要的数据
将css()函数查询到的结果转换为字符串或者列表,需要使用一个函数
• get()
• getall()

(2)属性提取

href_value = selector.css('a::attr(href)').get()   #提取href标签的值
title=page.css(".title-article::text").get()      #提取文本内容

2.selenium
选择元素的方法
find_element_by_class_name:根据class定位

find_element_by_css_selector:根据css定位

find_element_by_id:根据id定位

find_element_by_link_text:根据链接的文本来定位

find_element_by_name:根据节点名定位

find_element_by_partial_link_text:根据链接的文本来定位,只要包含在整个文本中即可

find_element_by_tag_name:通过tag定位

find_element_by_xpath:使用Xpath进行定位

PS:把element改为elements会定位所有符合条件的元素,返回一个List

比如:find_elements_by_class_name

返回的是web_element对象

3.tomd
text=tomd.Tomd(content).markdown
将获取的文章转换为markdown形式

二、代码展示

1.获取一篇文章

#对一篇文章的爬取
def spider_one_csdn(title_url):    # 目标文章的链接
    html=requests.get(url=title_url,headers=head).text
    page=parsel.Selector(html)
    #创建解释器
    title=page.css(".title-article::text").get()
    title=filter_str(title)
    print(title)
    content=page.css("article").get()
    content=re.sub("<a.*?a>","",content)
    content = re.sub("<br>", "", content)
    #过滤a标签和br标签
    text=tomd.Tomd(content).markdown
    #转换为markdown 文件
    path = os.getcwd()  # 获取当前的目录路径
    file_name = "./passage"
    final_road = path + file_name
    try:
        os.mkdir(final_road)
        print('创建成功!')
    except:
        # print('目录已经存在或异常')
        pass
    with open(final_road+r"./"+title+".md",mode="w",encoding="utf-8") as f:
        f.write("#"+title)
        f.write(text)
    time.sleep(1)

2.获取博主所有文章

def get_article_link(user):
    #获取某个博主的所有文章
    page=1
    while True:
        link = "https://blog.csdn.net/{}/article/list/{}".format(user, page)
        print("现在爬取第", page, "页")
        html = requests.get(url=link, headers=head).text
        cel = parsel.Selector(html)
        name_link = cel.css(".article-list h4 a::attr(href) ").getall()
        if not name_link:
            break
            #没有文章就退出
        for name in name_link:
            spider_one_csdn(name)
        page+=1
    time.sleep(1)

3.获取博主名字

def nb_bozhu():
    #获取前十博主的csdn名称
    driver=webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get("https://blog.csdn.net/rank/writing_rank")
    names=driver.find_elements_by_xpath("//div[@class='rank-item-box d-flex align-items-center']//div[@class='name d-flex align-items-center']/h2/a")
    name_list=[]
    for name in names:
        final_name=name.get_attribute("outerHTML")
        final_name=re.sub('<a href="https://blog.csdn.net/',"",final_name)
        final_name=re.sub('">.*</a>','',final_name)
        name_list.append(final_name)
        print(final_name)
    driver.quit()
    time.sleep(1)
    return name_list

最终执行后会生成在程序所在目录下生成passage目录,里面有所有文章
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tansty_zh/article/details/108363992
今日推荐