• 爬虫 | cnblog文章收藏排行榜(“热门文摘”)


    背景说明
    因为加入cnblog不久,发现上面有很多优秀的文章。
    无意中发现cnblog有整理文章的收藏排行榜,也就是热门文摘.
    不过有点坑的是,这个页面不支持搜索,所以就写一个简单的脚本把这些热门文章理出来。

    整个爬虫的思路

    1. 确定页面的接口,一般常见的格式是html或者json格式;
    2. 确定页面迭代变量,找到page_index
    3. 对单页进行测试,包括header信息的配置,以及所需字段的提取;
    4. 对第3步中的代码进行封装,放到循环内执行;

    页面说明
    收藏文章排行的url示例
    https://wz.cnblogs.com/hot/All/2
    最后一个是页数(page index),这个是后面要放入for循环里的迭代变量.
    从页面上的显示来看,最多可以抓100页

    需要用的module

    import requests,re
    import pandas as pd
    import lxml.html
    import time,sys
    

    单页测试

    先测试下单个页面,需要解析出页面下的:

    • 文章url
    • 文章title
    • 收藏数
    url = ' https://wz.cnblogs.com/hot/All/2'
    
    # 配置header信息
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
        ,'Cookie': '这里cookie需要自行填写,需要登陆cnblog账号'
    }
    
    r = requests.get(url, headers=headers)
    
    # 页面的编码格式
    r.encoding = 'utf-8'
    

    接下来用lxml来解析html页面信息

    tree = lxml.html.fromstring(r.text)
    
    # 这个的html路径在chrome浏览器的Elements下很容易查到
    item_list = tree.cssselect('div.wz_item_content')
    # 一页有20篇收藏的问斩个,所以item_list的长度是20
    
    # 取其中一篇文章来解析
    item_tmp = item_list[0]
    
    # 可以用如下命令看看文章的信息是都包含在里面了
    # item_tmp.text_content()
    
    x = item_tmp.cssselect('h2 > a')[0]
    
    # 链接,可以用x.items()来查看属性
    x.get('href')
    
    # 标题
    x.text_content()
    
    # 收藏数
    item_tmp.cssselect('span.wz_item_count')[0].text_content()
    

    批量抓取

    # 定义list来保存数据
    
    data_info = list()
    
    for page_idx in range(1,100+1):
        # 进度提示
        sys.stdout.write('
    当前进度 第%d页'%(page_idx))
        sys.stdout.flush()
        time.sleep(0.1)
        
        url = ' https://wz.cnblogs.com/hot/All/'+str(page_idx)
       
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
            ,'Cookie': '请自行配置'
        }
        
        r = requests.get(url, headers=headers)
        
        if r.status_code == 200:
            r.encoding = 'utf-8'
            
            tree = lxml.html.fromstring(r.text)
    
            item_list = tree.cssselect('div.wz_item_content')
    
            for item_tmp in item_list:
    
                x = item_tmp.cssselect('h2 > a')[0]
    
                # 链接
                d_url = x.get('href')
    
                # 标题
                d_title = x.text_content()
    
                # 收藏数
                d_ucnt = item_tmp.cssselect('span.wz_item_count')[0].text_content()
                
                data_info.append([d_url,d_title,d_ucnt])
            
    

    数据保存

    先将list转成dataframe格式

    data_df = pd.DataFrame(data_info)
    data_df.columns = ['url','title','ucnt']
    data_df.head(3)
    

    接下来我们定义一个函数:从url中提取博客的名称

    # 从url中提取博主的名称
    # 如果是博客文章,具有的特征有两点:1.www.cnblogs.com 2.后面对接的就是博主的账号名称,名称长度是两位以上的
    
    def extract_name(url):
        if 'www' in url:
            
            blog_name = re.findall('.com/(.*?)/',url)[0]
            
            if len(blog_name)<2:
                blog_name = '无名氏'
        else:
            blog_name = '无名氏'
            
        return(blog_name)
    

    新增一列,标注博客的名称

    data_df['blog_name'] = data_df['url'].apply(lambda x: extract_name(x))
    
    data_df.head(5)
    

    将数据导出成csv格式文件,这样方便搜索

    # 备份下数据,后面可能还有用
    data_df.to_csv('cnblog_收藏文章排行榜_20200322.csv',index=False)
    

    如果你想直接获取该列表,请访问
    百度网盘链接 密码: 3yw4

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    转载请注明作者及出处

  • 相关阅读:
    wget(转)
    852. Peak Index in a Mountain Array
    617. Merge Two Binary Trees
    814. Binary Tree Pruning
    657. Judge Route Circle
    861. Score After Flipping Matrix
    832. Flipping an Image
    461. Hamming Distance
    654. Maximum Binary Tree
    804. Unique Morse Code Words
  • 原文地址:https://www.cnblogs.com/dataxon/p/12549164.html
Copyright © 2020-2023  润新知