背景说明

因为加入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('\r当前进度 第%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

爬虫 | cnblog文章收藏排行榜(“热门文摘”)的更多相关文章

  1. 利用Python编写网络爬虫下载文章

    #coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期 ...

  2. DEDECMS之七 如何实现文章推荐排行榜

    经常可以看到各种排行榜,这些文章列表的标题之前加了序号,前三条还有显眼样式 1.实现效果 2.实现方法 <ul class="hotPh1"> {dede:arclis ...

  3. python爬虫——词云分析最热门电影《后来的我们》

    1 模块库使用说明 1.1 requests库 requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更 ...

  4. python爬虫CSDN文章抓取

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/nealgavin/article/details/27230679 CSDN原则上不让非人浏览訪问. ...

  5. 测试cnblog文章内部JS

    添加几个按钮 行内js 写法: <button onclick="javascript:alert('行内js')">行内js</button> 注意:al ...

  6. python python 入门学习之网页数据爬虫cnbeta文章保存

    需求驱动学习的动力. 因为我们单位上不了外网所以读新闻是那么的痛苦,试着自己抓取网页保存下来,然后离线阅读.今天抓取的是cnbeta科技新闻,抓取地址是http://m.cnbeta.com/wap/ ...

  7. WinForm控件使用文章收藏整理完成

    对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Lab ...

  8. Android文章收藏

     Android集 1.Himi李华明的<Android游戏开发专栏>http://blog.csdn.net/column/details/androidgame.html2.老罗的&l ...

  9. Python 学习文章收藏

    作者 标题 rollenholt Python修饰器的函数式编程 - Rollen Holt - 博客园 rollenholt python操作gmail - Rollen Holt - 博客园 ro ...

随机推荐

  1. C++中的大数乘的实现

    代码 来源:面试常考 大数加减乘除 #include <iostream> #include <vector> #include <string> using na ...

  2. java的Junit单元测试

    函数主要分为以下几类: 1.有固定返回值的.用assert 方法即可. 2.修改了状态. (1)修改了数据库中的数据.可以查询数据库(select  语句),看数据是否发生了改变. --原则上应该是用 ...

  3. Apollo核心概念之“Namespace”

    转载于https://github.com/ctripcorp/apollo,by Ctrip, Inc. Apollo核心概念之“Namespace” 1. 什么是Namespace? Namesp ...

  4. classnames

    在React中编写模板时给标签添加class. 如果是固定的className="XX"就可以了. 如果要根据状态值动态应用或去除, 或使用多个class时就麻烦了. 可以使用cl ...

  5. 关于运算符的那些坑—自增x++&&++y

    题目 比较常见的问题,因为比较细,看书的时候一不注意可能就过去啦,但是遇到的时候就会容易出问题.先看下面程序,考虑一下运行结果是什么呢? int x = 1, y = 1; if(x++ == 2 & ...

  6. linux下查找文件及查找包含指定内容的文件常用命令

    whereis <程序名称> 查找软件的安装路径-b 只查找二进制文件-m 只查找帮助文件-s 只查找源代码-u 排除指定类型文件-f 只显示文件名-B <目录> 在指定目录下 ...

  7. 为何银行愿为收购supercell做无权追索融资?

    无追索权融资又称纯粹的项目融资,是指贷款人对项目主办人没有任何追索权的项目融资.简单来说,这是一种项目失败,也无法追尝的承诺,一般发生在石油.天然气.煤炭.铜.铝等矿产资源开发等相对较为保值的项目融资 ...

  8. 神州优车挂牌新三板!专车B2C对决C2C将愈发狂暴?

    近日,全国中小企业股份转让系统公告显示,神州优车已获准在新三板挂牌.神州优车作为神州专车的主营主体,此次挂牌新三板意味着神舟专车成功突围,成为"专车第一股".相比滴滴.Uber中国 ...

  9. OpenCV3入门(十一)图像直方图

    1.直方图的概念 灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像元的个数.确定图像像素的灰度值范围,以适当的灰度间隔为单位将其划分为若干等级,以横轴表示灰度级,以纵轴表示每一灰度级具有的像素 ...

  10. Leetcode 24题 两两交换链表中的节点(Swap Nodes in Pairs))Java语言求解

    题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4,你应该返回 ...