首页 > 技术文章 > 博客园200页数据的抓取

baihuatian 2019-09-27 11:35 原文

1:任务步骤:抓取博客的(标题,简要内容,发布人,发布时间)

 

首先直接上手requests获取网站数据,发现可以直接获取。

 

 

 

因此不需要进行多余的反爬措施,只需要专注于数据的获取逻辑。

数据是直接放在源代码中的。

 

数据获取:观察页面源代码可知

数据都是存放在  ”<div class="post_item">“标签下,可以选择先获取某个博客的所有内容随后再进行信息的获取

数据的获取则是使用select函数,css选择器来获取信息

这里我定义了两个函数

其一是获取网页页面链接的函数

def return_url_list(page):
    
    """
    生成博客园博客url列表并返回
    """
    
    url_list = []
    for i in range(1,page+1):
        url_list.append("https://www.cnblogs.com/cate/python/#p" + str(i)) # 将两个页数不同的url比较可以知道其不同点在于最后的一个数字,因此可以通过for循环构建链接

  # 但其实我想到了一种更为节省空间的方法,即使用生成器,每生成一个就抓起一个
return url_list

其二是根据链接获取网页信息并输出的函数

def get_data(url,m):
    
    """
    获取博客园中python栏目下的200页数据
    数据包括:
        1:博客标题
        2:博客简述
        3:发布人
        4:发布日期
        5:阅读数量和评论数量
    """
    
    rsp = requests.get(url,headers={'user-agent':"chrome/10"})
    rsp.encoding = rsp.apparent_encoding
    
    soup = bs(rsp.text)
    k = 0
    for tag in soup.select("div.post_item_body"):
        
        print("博客标题:",tag.h3.text)
        print("博客链接:",tag.h3.a["href"])
        for t in tag.select("div.post_item_foot"):
            t = t.get_text()
            l = t.split("\n")
            for i in l:# 这里主要是对div标签下的数据简单地获取了
                i_list = i.split(" ")
                for i in i_list:
                    if len(i) >= 2:
                        print(i)
                

        k = k + 1
        print("==============第 {} 个博客成功================".format((m-1)*20+k))
        

 

结果展示;

 

 

2:存在的缺陷

标签的获取没有充分的经验,总是使用落后的select来获取标签,一遇到比较少见的标签就不知所措,毫无头绪,这是需要改正的地方。

3:优点

表示我这次对代码进行了分门别类的优秀操作,因为我使用的是jupyter,所以我将需要导入模块的代码放在了第一个块,将第一个函数放在了第二块,将第二个函数放在了第三块,最后的主函数放在了第四块,这样编码之后我发现不仅思路更加清晰了,其美观程度也是上升了一大截,不再是一团糟的感觉了,我用起来也是舒服很多。

希望继续保持,加油加油。

推荐阅读