Python采集CSDN博客排行榜数据
文章目录
- 前言
- 网络爬虫
- 搜索引擎
- 爬虫应用
- 谨防违法
- 爬虫实战
- 网页分析
- 编写代码
- 运行效果
- 反爬技术
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771
前言
网络爬虫
网络爬虫自动化浏览网络中的信息的时候需要按照我们制定的规则进行,这些规则我们称之为网络爬虫算法。使用Python可以很方便地编写出爬虫程序,进行互联网信息的自动化检索。
搜索引擎
爬虫应用
- QQ空间用户发说说的时间规律:晚上22点左右,平均发说说的数量是一天中最多的时候;
- QQ空间用户的年龄阶段分布:出生于1990年到1995年的用户相对来说较多;
- QQ空间用户的性别分布:男生占比多于50%,女生占比多于30%,未填性别的占10%左右。
用户爬虫还可以做很多事情,比如爬取淘宝的用户信息,可以分析淘宝用户喜欢什么商品,从而更有利于我们对商品的定位等。由此可见,利用用户爬虫可以获得很多有趣的潜在信息。
谨防违法
网络爬虫在大多数情况中都不违法,我们生活中几乎每天都在爬虫应用(如百度),从目前的情况来看,如果抓取的数据属于个人使用或科研范畴,基本不存在问题;而如果数据属于商业盈利范畴,就有可能属于违法行为。
淘宝网对用户代理为百度爬虫引擎进行了规定,我们可以查看淘宝网的 robots.txt:
- User-agent:
*
表示允许所有搜索引擎蜘蛛来爬行抓取,也可以把*去掉,改为特定某一个或者某些搜索引擎蜘蛛来爬行抓取,如百度是Baiduspider,谷歌是Googlebot; - 以 Allow 项的值开头的URL是允许robot访问的。例如,Allow:/article允许百度爬虫引擎访问 /article.htm、/article/12345.com等。
- 以 Disallow 项为开头的链接是不允许百度爬虫引擎访问的。例如,Disallow:/product/ 不允许百度爬虫引擎访问 /product/12345.com 等。
最后一行,
Disallow:/
表示禁止百度爬虫访问除了Allow规定页面外的其他所有页面。百度作为一个搜索引擎,良好地遵守了淘宝网的 robot.txt 协议。
爬虫实战
下面将演示如何借助 Python 爬虫爬取CSDN排行榜Top 100的大佬们的数据信息,保存到本地 Excel 文件进行膜拜。
网页分析
访问本次爬取目标——CSDN博客排行榜:https://blog.csdn.net/rank/writing_rank:
/api/WritingRank/weekList?username=weixin_39190897&page=1&size=10
url: 从返回的json数据看,显然该请求便是需要爬取的url,而不是最开始给的网址
username: 这个表示你自己的用户id,不带的话就表示没登入 (不带也可以)
page: 表示当前页数,测试发现这个只能显示Top100,也就最大10页
size: 表示每次每页显示的数据量,每次json包里面只包括 10 个大佬的数据这里面只有page会发生变化,所以我们只要一个循环,不断的去构造这个网址就行了。
编写代码
def __init__(self):self.ua = UserAgent().chromeself.url = 'https://blog.csdn.net/api/WritingRank/weekList?' # ajax 请求网址self.header = {'Referer': 'https://blog.csdn.net/weixin_39190897',"Upgrade-Insecure-Requests": "1",'User-Agent': self.ua}# 配置保存表格的基本self.workbook = Workbook()self.sheet = self.workbook.activeself.sheet.title = 'CSDNTop100信息'self.sheet['A1'] = '排名'self.sheet['B1'] = '用户名'self.sheet['C1'] = '用户头像'self.sheet['D1'] = '用户博客网址'self.sheet['E1'] = '粉丝数'self.sheet['F1'] = '点赞数'self.sheet['G1'] = '上周排名'self.sheet['H1'] = '博客等级'self.sheet['I1'] = '排名时间'def __params(self, offset):self.offset = offset"""构造请求参数"""self.params = {"username": "weixin_39190897","page": str(self.offset),"size": "10"}
def spider(self):"""构造 多页 爬取"""for i in range(1, 11):self.__params(i)url = self.url + urlencode(self.params)r = requests.get(url, headers=self.header)if r.status_code == 200:r.encoding = r.apparent_encodingyield r.json()else:print('[info] request error ! the status_code is ' + r.status_code)time.sleep(0.5)
def parse_json(self, r_json):"""根据网站请求返回的json包 进行进一步分析"""# 第一层first_data = r_json.get('data')if first_data:# 第二层list_data = first_data.get('list')if list_data: # 判空for i in list_data:rank = i.get("ranking")head_image = i.get('avatar')user_nickname = i.get('user_nickname') # 用户名username = i.get('username') # 用户idfans_num = i.get('fans_num') # 粉丝fav_num = i.get('fav_num') # 获赞last_rank = i.get('last_ranking') # 上周排名leave = i.get('profile_level').get('level') # 博客等级if rank and head_image and user_nickname and user_nickname and username and fans_num \and fav_num and last_rank and leave:# 这里保存数据 只是为了方便转换其他保存格式 仅仅是保存excel中用到列表yield {'rank': rank,'user_nickname': user_nickname,'head_image': head_image,'username': 'https://blog.csdn.net/' + username,'fans_num': fans_num,'fav_num': fav_num,'last_rank': last_rank,'leave': leave}
def down(self, item):"""保存至excel表格"""now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # 时间leave_list = []for value in item.values():leave_list.append(value)leave_list.append(now_time)self.sheet.append(leave_list)
# -*- coding : utf-8 -*-
import requests
from urllib.parse import urlencode
from fake_useragent import UserAgent
import time
from openpyxl import Workbookclass CSDNSpider(object):"""爬取csdn top 100 的各种信息url = 'https://blog.csdn.net/rank/writing_rank'ajax方式"""def __init__(self):self.ua = UserAgent().chromeself.url = 'https://blog.csdn.net/api/WritingRank/weekList?' # ajax 请求网址self.header = {'Referer': 'https://blog.csdn.net/weixin_39190897',"Upgrade-Insecure-Requests": "1",'User-Agent': self.ua}# 配置保存表格的基本self.workbook = Workbook()self.sheet = self.workbook.activeself.sheet.title = 'CSDNTop100信息'self.sheet['A1'] = '排名'self.sheet['B1'] = '用户名'self.sheet['C1'] = '用户头像'self.sheet['D1'] = '用户博客网址'self.sheet['E1'] = '粉丝数'self.sheet['F1'] = '点赞数'self.sheet['G1'] = '上周排名'self.sheet['H1'] = '博客等级'self.sheet['I1'] = '排名时间'def __params(self, offset):self.offset = offset"""构造请求参数"""self.params = {"username": "weixin_39190897","page": str(self.offset),"size": "10"}def spider(self):"""构造 多页 爬取"""for i in range(1, 11):self.__params(i)url = self.url + urlencode(self.params)r = requests.get(url, headers=self.header)if r.status_code == 200:r.encoding = r.apparent_encodingyield r.json()else:print('[info] request error ! the status_code is ' + r.status_code)time.sleep(0.5)def parse_json(self, r_json):"""根据网站请求返回的json包 进行进一步分析"""# 第一层first_data = r_json.get('data')if first_data:# 第二层list_data = first_data.get('list')if list_data: # 判空for i in list_data:rank = i.get("ranking")head_image = i.get('avatar')user_nickname = i.get('user_nickname') # 用户名username = i.get('username') # 用户idfans_num = i.get('fans_num') # 粉丝fav_num = i.get('fav_num') # 获赞last_rank = i.get('last_ranking') # 上周排名leave = i.get('profile_level').get('level') # 博客等级if rank and head_image and user_nickname and user_nickname and username and fans_num \and fav_num and last_rank and leave:# 这里保存数据 只是为了方便转换其他保存格式 仅仅是保存excel中用到列表yield {'rank': rank,'user_nickname': user_nickname,'head_image': head_image,'username': 'https://blog.csdn.net/' + username,'fans_num': fans_num,'fav_num': fav_num,'last_rank': last_rank,'leave': leave}def down(self, item):"""保存至excel表格"""now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())leave_list = []for value in item.values():leave_list.append(value)leave_list.append(now_time)self.sheet.append(leave_list)def main(self):"""调用函数"""print('The spider is start!')for content in self.spider():for item in self.parse_json(content):self.down(item)self.workbook.save(filename='CSDNTop100.xlsx')self.workbook.close()print('The CSDNTop100 spider is over!')a = CSDNSpider()
a.main()
此处代码中出现使用了 yield 的函数,属于Python生成器(generator),跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
更多 yield 关键词的理解可参考:python中yield的用法详解——最简单,最清晰的解释。
运行效果
脚本运行成功后在项目工程目录下自动生成 CSDNTop100.xlsx
文件:
反爬技术
# 设置请求头信息
headers = {'Host': 'https://blog.csdn.net','Referer': 'https://blog.csdn.net/weixin_43499626/article/details/85875090','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
response = requests.get("http://www.baidu.com", headers=headers)
当我们用同一个ip多次频繁访问服务器时,服务器会检测到该请求可能是爬虫操作。因此就不能正常的响应页面的信息了。解决办法常用的是使用IP代理池。网上就有很多提供代理的网站。
proxies = {"http": "http://119.101.125.56","https": "http://119.101.125.1",
}
response = requests.get("http://www.baidu.com", proxies=random.choices(proxies))
Python采集CSDN博客排行榜数据相关推荐
- Python爬虫-CSDN博客排行榜数据爬取
文章目录 前言 网络爬虫 搜索引擎 爬虫应用 谨防违法 爬虫实战 网页分析 编写代码 运行效果 反爬技术 前言 开始接触 CTF 网络安全比赛发现不会写 Python 脚本的话简直寸步难行--故丢弃 ...
- 【爬虫+数据可视化】Python爬取CSDN博客访问量数据并绘制成柱状图
以下内容为本人原创,欢迎大家观看学习,禁止用于商业及非法用途,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/article/ ...
- python csdn博客_GitHub - 1783955902/CSDNBlogBackup: Python实现CSDN博客的完整备份
Python实现CSDN博客的完美备份 出发点 之所以造这个轮子无非是现有的轮子不好使,CSDN官网是推出的博客备份在系统中读不到博客数据,打开后还会闪退,其他人写的工具,要么是收费,要么只是对网页的 ...
- 30行代码统计自己 CSDN 博客相关数据
1. 编写目的 爬虫本身是一个非常简单的事情,都是由于业务需要才变得越来越复杂的.为了方便广大开发者,也有很多简单好用的爬虫框架,但这里不使用那些已经实现了的专用框架,也不能起到任何商业化的目的,只是 ...
- Python备份CSDN博客
用Python实现备份CSDN博客: 功能:备份输入user的所有博文到当前目录下的user文件夹内(html格式) 不足:暂时还没开多线程,并且反盗链之类还没有处理(虽然转载的文章一般都是保存没反盗 ...
- Python备份CSDN博客的完整页面
在CSDN论坛发现了一个求助帖,帮忙修改一个备份CSDN博客的Python脚本,应该是运行不了的代码.代码的时间比较久远,而且是用python2写的,所以我并没有尝试运行就直接用Python3来进行改 ...
- csdn博客排行榜 第一名
大晚上不睡觉,八卦一下,下面是一个CSDN提问的文章, CSDN博客排名第一的是谁啊?-http://bbs.csdn.net/topics/340052616.说实话比较一直想知道CSDN排名第一的 ...
- 采集CSDN博客中的RSS订阅小功能
<?php header("content-type:text/html;charset=utf8");//编码 $url = "https://blog.csdn ...
- 『Python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析CSDN与博客园博客阅读数据
文章目录 0x01:引子 首先介绍一下网络爬虫是什么,可以用来做什么? 这里简单探讨一下网络爬虫的合法性 正式进入爬虫实战前,需要我们了解下网页结构 HTML CSS JScript 写一个简单的 H ...
最新文章
- 离职后竟半夜偷溜回办公室写代码?一个为自由软件而战斗的程序员
- Java Socket多线程异步通信
- 聚类分析在用户行为中的实例_聚类分析在用户分类中的应用
- 透过微信应用号,看HTML5与Native进入融合时代
- pdf 天线理论与技术 钟顺时_虚拟仿真技术 | 基于HFSS仿真软件的微波天线课程教学探索...
- Java java.lang.SecurityException: Prohibited package name
- 服务器连接不稳定fifa,fifa服务器链接异常
- 28.课时28.【Django模块】with标签使用详解(Av61533158,P28)
- (文中有惊喜)走进云时代的数据库
- UE4 Light Functions(光源函数)
- 在DOS下修改本机IP地址
- 鲍威尔共轭方向法c语言程序,鲍威尔共轭方向法VB源程序
- LDA模型训练与得到文本主题、困惑度计算(含可运行案例)
- 树莓派CM4烧录系统
- (2)QlikView安装
- 计算机网络 中 网络层
- 数仓建模—数据治理的本质与实践
- 苹果电脑(mac os x)键盘使用技巧
- 流量变现平台市场分析报告-
- Python 计算思维训练——字典与字符串练习