Python爬虫入门教程【18】: 36氪(36kr)数据抓取 scrapy
1. 36氪(36kr)数据----写在前面
今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备
36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去。
网址 https://36kr.com/
2. 36氪(36kr)数据----数据分析
36kr的页面是一个瀑布流的效果,当你不断的下拉页面的时候,数据从后台追加过来,基于此,基本可以判断它是ajax异步的数据,只需要打开开发者工具,就能快速的定位到想要的数据,我们尝试一下!
捕获链接如下
https://36kr.com/api/search-column/mainsite?per_page=20&page=1&_=1543840108547
https://36kr.com/api/search-column/mainsite?per_page=20&page=2&_=1543840108547
https://36kr.com/api/search-column/mainsite?per_page=20&page=3&_=1543840108547
https://36kr.com/api/search-column/mainsite?per_page=20&page=4&_=1543840108547
在多次尝试之后,发现per_page最大可以扩展到300,但是当大于100的数据,返回的数据并不是很理想,所以,我们拟定为100即可,page就是页码,这个不断循环叠加即可。
上面的参数还有一个更加重要的值,叫做total_count
总共有多少文章数目。有这个参数,我们就能快速的拼接出来,想要的页码了。
3. 36氪(36kr)数据----创建scrapy项目
scrapy startproject kr36
4. 36氪(36kr)数据----创建爬虫入口页面
scrapy genspider Kr36 "www.gaokaopai.com"
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
5. 36氪(36kr)数据----编写url生成器
页面起始地址start_urls
为第一页数据,之后会调用parse
函数,在函数内容,我们去获取total_count
这个参数
这个地方,需要注意 yield
返回数据为Request()
关于他的详细说明,请参照
https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html
所有参数清单,参数名字起得好,基本都能代表所有的意思了。比较重要的是url
和callback
class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
class Kr36Spider(scrapy.Spider):name = 'Kr36'allowed_domains = ['36kr.com']start_urls = ['https://36kr.com/api/search-column/mainsite?per_page=100&page=1&_=']def parse(self, response):data = json.loads(response.body_as_unicode())totle = int(data["data"]["total_count"])#totle = 201for page in range(2,int(totle/100)+2):print("正在爬取{}页".format(page),end="")yield Request("https://36kr.com/api/search-column/mainsite?per_page=100&page={}&_=".format(str(page)), callback=self.parse_item)
6. 36氪(36kr)数据----解析数据
在解析数据过程中,发现有时候数据有缺失的情况发生,所以需要判断一下 app_views_count
, mobile_views_count
, views_count
, favourite_num
是否出现在字典中。
注意下面代码中的Kr36Item类,这个需要提前创建一下
Kr36Item
class Kr36Item(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()app_views_count = scrapy.Field() # APP观看数量mobile_views_count = scrapy.Field() # 移动端观看数量views_count = scrapy.Field() # PC观看数量column_name = scrapy.Field() # 类别favourite_num = scrapy.Field() # 收藏数量title = scrapy.Field() # 标题published_at = scrapy.Field() # 发布时间is_free = scrapy.Field() # 是否免费username = scrapy.Field()
def parse_item(self,response):data = json.loads(response.body_as_unicode())item = Kr36Item()for one_item in data["data"]["items"]:print(one_item)item["app_views_count"] = one_item["app_views_count"] if "app_views_count" in one_item else 0# APP观看数量item["mobile_views_count"] = one_item["mobile_views_count"] if "mobile_views_count" in one_item else 0 # 移动端观看数量item["views_count"] = one_item["views_count"] if "views_count" in one_item else 0 # PC观看数量item["column_name"] = one_item["column_name"] # 类别item["favourite_num"] = one_item["favourite_num"] if "favourite_num" in one_item else 0 # 收藏数量item["title"] = one_item["title"] # 标题item["published_at"] = one_item["published_at"] # 发布时间item["is_free"] = one_item["is_free"] if "is_free" in one_item else 0# 是否免费item["username"] = json.loads(one_item["user_info"])["name"]yield item
最后打开settings.py
中的pipelines
编写数据持久化代码
ITEM_PIPELINES = {'kr36.pipelines.Kr36Pipeline': 300,
}
import os
import csvclass Kr36Pipeline(object):def __init__(self):store_file = os.path.dirname(__file__)+'/spiders/36kr.csv'self.file = open(store_file,"a+",newline="",encoding="utf_8_sig")self.writer = csv.writer(self.file)def process_item(self, item, spider):try:self.writer.writerow((item["title"],item["app_views_count"],item["mobile_views_count"],item["views_count"],item["column_name"],item["favourite_num"],item["published_at"],item["is_free"],item["username"]))print("数据存储完毕")except Exception as e:print(e.args)def close_spider(self,spider):self.file.close()
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
7. 36氪(36kr)数据----获取数据
运行上述代码,没有做过多的处理,也没有调整并发速度,也没有做反爬措施。跑了一下,大概获取到了69936
条数据,和预估的差了300多条,问题不大,原因没细查。
Python爬虫入门教程【18】: 36氪(36kr)数据抓取 scrapy相关推荐
- Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy
1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数 ...
- Python爬虫入门【18】: 36氪(36kr)数据抓取 scrapy
1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备 36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去. 网址 ...
- 【Python】36氪(36kr)数据抓取 scrapy
1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备 36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去. 网址 ...
- Python爬虫入门教程石家庄链家租房数据抓取
1. 写在前面 这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材. 我们需要爬取的网址为:https://sjz.lianjia.com/zufang/ 2. 分析 ...
- Python爬虫入门教程 22-100 CSDN学院课程数据抓取
1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了,选择恐惧症使得我不知道该拿谁下手,找来找去,算了,还是抓取CSDN学院吧,CSDN学院的网站为 https://edu.csdn.net/ ...
- Python爬虫入门教程 3-100 美空网数据爬取 1
1.美空网数据-简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...
- Python爬虫入门教程18:好看视频的爬取
前言
- Python爬虫入门教程 3-100 美空网数据爬取
1.美空网数据-简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...
- python数据抓取课程_Python爬虫入门教程 22-100 CSDN学院课程数据抓取
1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了,选择恐惧症使得我不知道该拿谁下手,找来找去,算了,还是抓取CSDN学院吧,CSDN学院的网站为 https://edu.csdn.net/ ...
最新文章
- vue-preview动态获取图片宽高并增加旋转功能
- python 分析两组数据的差异_R语言limma包差异基因分析(两组或两组以上)
- magento创建自定义页面 (Bestseller实例) Bestseller products in Magento
- Mr.J-- 图片墙动画效果
- Could not write JSON: (was java.lang.NullPointerException);
- Python(8)_初学Python
- Centos7安装32位库用来安装32位软件程序
- 阿里巴巴Java开发手册(原文地址)
- 我的大学 --- 郭天祥【2】
- Mac配置vscode ssh远程连接主机(远程办公必备)
- 聚集索引和非聚集索引的区别
- 奥西400服务器维修,奥西tds400驱动
- Math.abs()方法
- c语言循环中怎样读取多行,c++循环读取多行文本文件
- 【C/C++】标准库之 numeric
- 6个不亚于公务员的职业选择
- Linux驱动01 - Timer
- 多线程核心8-3:线程三大安全问题之发布与逸出
- 用php写表格代码,php读写excel表格程序代码
- static_cast 剖析
热门文章
- bdd java 界面测试_行为驱动:第一个BDD测试用例
- mini2440 linux内核编译与移植 课程设计,linux内核移植步骤-mini2440
- 动脑学院-网络请求框架
- (六)CCD传感器1000帧fpga-68013-usb2.0传输:上位机MFC的c++部分
- 北邮计算机复试英语,2019北邮计算机学院-跨考-复试被刷-失败经验
- 赛灵思的FPGA入门初体验
- SRIO IP Core license for VC709 ethenet 40/50G subsystem IP core license for VCU118
- 22.8.29 C语言作业5道
- x64驱动:DKOM 实现进程隐藏
- 入门级Node.js express服务端开发_Android签到APP