• 爬虫 | 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

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

    转载请注明作者及出处

  • 相关阅读:
    20200910-3 命令行和控制台编程
    C语言1作业04
    C语言1博客作业03
    c语言1博客作业02
    2018寒假作业--3抓老鼠啊~亏了还是赚了?
    2018寒假作业2--币值转换
    2018寒假作业-1 打印沙漏
    记叙在人生路上对我影响最大的三位老师
    自我介绍
    抓老鼠啊~亏了还是赚了?编程总结
  • 原文地址:https://www.cnblogs.com/dataxon/p/12549164.html
Copyright © 2020-2023  润新知