Python通过关键词爬取csdn博客文章

摘要:利用requests和BeautifulSoup,爬取网页的源代码,从而抓取到有用的字符信息后进行筛选与匹配。

注:csdn提供有搜索栏,可以通过url链接直接进行搜索,搜索结果的界面是动态网页和静态网页结合的。(具体我也不知道为什么,但是确实搜索结果一部分在源代码里有,一部分没有)简单起见,我们只爬取静态的部分,这样我们只需解析源代码就好了。

先上代码:

#通过关键词爬取csdn博客文章

import requests
from bs4 import BeautifulSoup
    
def getHTMLText(url): #作用:得到html的text
    try:
        r= requests.get(url,timeout =30)
        r.raise_for_status
        r.encoding= "utf-8"
        return r.text
    except:
        # print ("getHTMLText出现异常")
        return "getHTMLText出现异常"
    
def getInformation(soup): #作用:将html的有用信息筛选出来并储存到相对应的列表alist中
    
    #通过查看网页源代码,分析得到下面的解析特点。
    data =soup.find_all("dl")  #每个dl里面储存着一篇csdn博客的信息,1个dl里有1个dt和3个dd
    for dl in data:
        ldt=dl.find_all("dt")    #dt里储存着博客的题目
        for dt in ldt:
            # print (type(dt.get_text()))
            text=dt.get_text()
            # print (text)
            indexOfStart=text.find("\n")
            indexOfEnd=text.find("- CSDN博客")
            # print (indexOfStart)
            # print (indexOfEnd)
            title=text[indexOfStart:indexOfEnd-3].replace("\n","")
            print ("标题是:"+title)
            # print ("@@@@@@@@@@@@@@@@@@@@@@@@@@@")
        ldd =dl.find_all("dd") #1个dl里有3个dd,分别是作者日期浏览次数,简介,链接
        #作者日期浏览次数
        text = ldd[0].get_text()
        indexOfStart = text.find("作者")
        indexOfEnd = text.find("日期")
        author = text[indexOfStart+3:indexOfEnd - 3]
        print ("作者是:" + author)

        indexOfStart = text.find("日期")
        indexOfEnd = text.find("浏览")
        date = text[indexOfStart + 3:indexOfEnd - 3]
        print ("日期是:" +date)

        text = ldd[0].get_text()
        indexOfStart = text.find("浏览")
        indexOfEnd = text.find("次")
        clickTimes = text[indexOfStart + 3:indexOfEnd - 1]
        print ("浏览次数是:" + clickTimes)

        #简介
        text = ldd[1].get_text()
        text=text.replace("\n","")
        print ("简介是:" + text)

        #链接
        text = ldd[2].get_text()
        print ("链接是:" + text)

        print ("**********************************************************")



def main():
    a=["线程","地址"]
    # keyword="进程"
    keyword=""
    for i in range(len(a)-1):
        keyword=keyword+a[i]+"+"
    keyword = keyword + a[-1]
    # print (keyword)

    html = getHTMLText(r"https://so.csdn.net/so/search/s.do?q="+keyword+"&t=blog&o=&s=&l=")
    soup = BeautifulSoup(html, "html.parser")
    getInformation(soup)

main()

图文解释:下图就是搜索界面,可以看出可以通过url链接直接定位到相关的搜索界面。


右键查看源代码,会发现一个比较特别的地方。常规的网页不是动态就是静态,前者从数据库服务器接收信息,后者源代码里则会有具体信息。但csdn的搜索界面的源代码是部分动态部分静态的。经过分析发现,也是有一定规律的。


如上图,这两篇博客的信息构架是不同的。上面只有标题、简介和链接,而下面的则多了作者、日期、浏览次数三个信息。然后在源代码里搜索上面的博客,搜不到,说明源代码里没有这篇博客的信息。但下面的博客是在源代码里是搜的到的。


我猜想原因应该是csdn在建设过程中有些改动,导致数据的不一致。简单起见我们只爬取静态的博客,即利用源代码的解析,提供我们需要的字符内容就行了。具体操作因网页而已,代码中有介绍,不再赘述。

最后是关键词的问题,单个关键词必较容易,多个关键词,csdn是采用的+连接,所以这时要注意输入的方式。

评价:

爬取效果:对于静态的博客爬取内容比较全面,便于观看浏览。

时间:速度较快,一秒之内就可以。因为不需要渲染,只需解析源代码即可。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值