爬虫 | cnblog文章收藏排行榜(“热门文摘”)
背景说明
因为加入cnblog不久,发现上面有很多优秀的文章。
无意中发现cnblog有整理文章的收藏排行榜,也就是热门文摘.
不过有点坑的是,这个页面不支持搜索,所以就写一个简单的脚本把这些热门文章理出来。
整个爬虫的思路:
- 确定页面的
接口,一般常见的格式是html或者json格式; - 确定页面迭代变量,找到page_index
- 对单页进行测试,包括header信息的配置,以及所需字段的提取;
- 对第
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文章收藏排行榜(“热门文摘”)的更多相关文章
- 利用Python编写网络爬虫下载文章
#coding: utf-8 #title..href... str0='blabla<a title="<论电影的七个元素>——关于我对电影的一些看法以及<后会无期 ...
- DEDECMS之七 如何实现文章推荐排行榜
经常可以看到各种排行榜,这些文章列表的标题之前加了序号,前三条还有显眼样式 1.实现效果 2.实现方法 <ul class="hotPh1"> {dede:arclis ...
- python爬虫——词云分析最热门电影《后来的我们》
1 模块库使用说明 1.1 requests库 requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更 ...
- python爬虫CSDN文章抓取
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/nealgavin/article/details/27230679 CSDN原则上不让非人浏览訪问. ...
- 测试cnblog文章内部JS
添加几个按钮 行内js 写法: <button onclick="javascript:alert('行内js')">行内js</button> 注意:al ...
- python python 入门学习之网页数据爬虫cnbeta文章保存
需求驱动学习的动力. 因为我们单位上不了外网所以读新闻是那么的痛苦,试着自己抓取网页保存下来,然后离线阅读.今天抓取的是cnbeta科技新闻,抓取地址是http://m.cnbeta.com/wap/ ...
- WinForm控件使用文章收藏整理完成
对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Lab ...
- Android文章收藏
Android集 1.Himi李华明的<Android游戏开发专栏>http://blog.csdn.net/column/details/androidgame.html2.老罗的&l ...
- Python 学习文章收藏
作者 标题 rollenholt Python修饰器的函数式编程 - Rollen Holt - 博客园 rollenholt python操作gmail - Rollen Holt - 博客园 ro ...
随机推荐
- kendoUI 免费部分开发部分经验。
kendo分多个版本,核心UI免费版.NET,JAVA,PHP对应的前后端开发版. 基础免费版开放的UI经多个测试,与收费封装的UI并无区别,收费版提供了后端代码和前端封装语法,使不懂JS前端的也可简 ...
- Android开发之《Module相互引用,NDK不能正常Debug》
解决Android Studio不能进入调试模式问题 Android Studio 2.2.3 native debug 无法调试?:https://www.zhihu.com/question/54 ...
- pycharm中进行全局搜索
- .Java中的异常、断言、日志【草稿下,Log4j专题】
(本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...
- Selenium&Pytesseract模拟登录+验证码识别
验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...
- HINOC2.0标准介绍(1):概述
本文首发于'瀚诺观察'微信公众号 摘要: 2016年3月18日,国家新闻出版广电总局批准发布了行业标准GY/T 297-2016<NGB宽带接入系统HINOC2.0物理层和媒体接入控制层技术规范 ...
- Swift和Objective-C中的协议(protocol)有什么异同
Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...
- vue組件自学
Vue组件 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添 ...
- text-decoration与color属性
text-decoration属性值 如果指定某个标签的text-decoration属性时,希望为其添加多个样式(比如:上划线.下划线.删除线),那么需要把所有的值合并到一个规则中才会生效 p{ t ...
- display的block、none、inline属性及解释
常会用到display对应值有block.none.inline这三个值 参数: block :块对象的默认值.用该值为对象之后添加新行.之前也添加一行. none :隐藏对象.与visibility ...