1. 36氪(36kr)数据----写在前面

今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数据分析博文,记得关注哦~

36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去。

网址 https://36kr.com/

2. 36氪(36kr)数据----数据分析

36kr的页面是一个瀑布流的效果,当你不断的下拉页面的时候,数据从后台追加过来,基于此,基本可以判断它是ajax异步的数据,只需要打开开发者工具,就能快速的定位到想要的数据,我们尝试一下!

捕获链接如下

  1. https://36kr.com/api/search-column/mainsite?per_page=20&page=1&_=1543840108547
  2. https://36kr.com/api/search-column/mainsite?per_page=20&page=2&_=1543840108547
  3. https://36kr.com/api/search-column/mainsite?per_page=20&page=3&_=1543840108547
  4. 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项目

  1. scrapy startproject kr36

4. 36氪(36kr)数据----创建爬虫入口页面

  1. scrapy genspider Kr36 "www.gaokaopai.com"

5. 36氪(36kr)数据----编写url生成器

页面起始地址start_urls为第一页数据,之后会调用parse函数,在函数内容,我们去获取total_count这个参数

这个地方,需要注意 yield 返回数据为Request() 关于他的详细说明,请参照

https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/request-response.html

所有参数清单,参数名字起得好,基本都能代表所有的意思了。比较重要的是urlcallback

  1. class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback])
  1. class Kr36Spider(scrapy.Spider):
  2. name = 'Kr36'
  3. allowed_domains = ['36kr.com']
  4. start_urls = ['https://36kr.com/api/search-column/mainsite?per_page=100&page=1&_=']
  5. def parse(self, response):
  6. data = json.loads(response.body_as_unicode())
  7. totle = int(data["data"]["total_count"])
  8. #totle = 201
  9. for page in range(2,int(totle/100)+2):
  10. print("正在爬取{}页".format(page),end="")
  11. 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_countmobile_views_countviews_countfavourite_num 是否出现在字典中。

注意下面代码中的Kr36Item类,这个需要提前创建一下

Kr36Item


  1. class Kr36Item(scrapy.Item):
  2. # define the fields for your item here like:
  3. # name = scrapy.Field()
  4. app_views_count = scrapy.Field() # APP观看数量
  5. mobile_views_count = scrapy.Field() # 移动端观看数量
  6. views_count = scrapy.Field() # PC观看数量
  7. column_name = scrapy.Field() # 类别
  8. favourite_num = scrapy.Field() # 收藏数量
  9. title = scrapy.Field() # 标题
  10. published_at = scrapy.Field() # 发布时间
  11. is_free = scrapy.Field() # 是否免费
  12. username = scrapy.Field()
  1. def parse_item(self,response):
  2. data = json.loads(response.body_as_unicode())
  3. item = Kr36Item()
  4. for one_item in data["data"]["items"]:
  5. print(one_item)
  6. item["app_views_count"] = one_item["app_views_count"] if "app_views_count" in one_item else 0# APP观看数量
  7. item["mobile_views_count"] = one_item["mobile_views_count"] if "mobile_views_count" in one_item else 0 # 移动端观看数量
  8. item["views_count"] = one_item["views_count"] if "views_count" in one_item else 0 # PC观看数量
  9. item["column_name"] = one_item["column_name"] # 类别
  10. item["favourite_num"] = one_item["favourite_num"] if "favourite_num" in one_item else 0 # 收藏数量
  11. item["title"] = one_item["title"] # 标题
  12. item["published_at"] = one_item["published_at"] # 发布时间
  13. item["is_free"] = one_item["is_free"] if "is_free" in one_item else 0# 是否免费
  14. item["username"] = json.loads(one_item["user_info"])["name"]
  15. yield item

最后打开settings.py中的pipelines编写数据持久化代码

  1. ITEM_PIPELINES = {
  2. 'kr36.pipelines.Kr36Pipeline': 300,
  3. }
  1. import os
  2. import csv
  3. class Kr36Pipeline(object):
  4. def __init__(self):
  5. store_file = os.path.dirname(__file__)+'/spiders/36kr.csv'
  6. self.file = open(store_file,"a+",newline="",encoding="utf_8_sig")
  7. self.writer = csv.writer(self.file)
  8. def process_item(self, item, spider):
  9. try:
  10. self.writer.writerow((
  11. item["title"],
  12. item["app_views_count"],
  13. item["mobile_views_count"],
  14. item["views_count"],
  15. item["column_name"],
  16. item["favourite_num"],
  17. item["published_at"],
  18. item["is_free"],
  19. item["username"]
  20. ))
  21. print("数据存储完毕")
  22. except Exception as e:
  23. print(e.args)
  24. def close_spider(self,spider):
  25. self.file.close()

7. 36氪(36kr)数据----获取数据

运行上述代码,没有做过多的处理,也没有调整并发速度,也没有做反爬措施。跑了一下,大概获取到了69936条数据,和预估的差了300多条,问题不大,原因没细查,哈哈哈哈

Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy的更多相关文章

  1. Python爬虫入门教程 23-100 石家庄链家租房数据抓取

    1. 写在前面 作为一个活跃在京津冀地区的开发者,要闲着没事就看看石家庄这个国际化大都市的一些数据,这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材. 我们需要爬取 ...

  2. Python爬虫入门教程 21-100 网易云课堂课程数据抓取

    写在前面 今天咱们抓取一下网易云课堂的课程数据,这个网站的数据量并不是很大,我们只需要使用requests就可以快速的抓取到这部分数据了. 你第一步要做的是打开全部课程的地址,找出爬虫规律, 地址如下 ...

  3. Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取

    写在前面 从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院,CSDN学院,网易云课堂,慕课网 ...

  4. Python爬虫入门教程 15-100 石家庄政民互动数据爬取

    石家庄政民互动数据爬取-写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为 http://www.sjz.gov.cn/col/14900 ...

  5. Python爬虫入门教程 18-100 煎蛋网XXOO图片抓取

    写在前面 很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都 ...

  6. Python爬虫入门教程第七讲: 蜂鸟网图片爬取之二

    蜂鸟网图片--简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度. 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文 ...

  7. Python爬虫:新浪新闻详情页的数据抓取(函数版)

    上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数, ...

  8. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  9. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

随机推荐

  1. Paxos协议超级详细解释+简单实例

    转载自:  https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例   Basic-Paxos算法 ...

  2. 最短路径---dijkstra算法模板

    dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...

  3. Cow Contest POJ - 3660 (floyd 传递闭包)

    N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...

  4. 学习easyui的小伙伴有福利了

    easy-ui常用属性和方法 css定义与js定义两个版本

  5. python-MYSQL(包括ORM)交互

    1.首先,我们必须得连上我们的MYSQL数据库.个人遇到连不上MYSQL数据的问题主要有:数据库的权限问题.数据库表权限的问题 同时获取数据库中的数据等. //==================== ...

  6. [R]R语言的module工程化

    很遗憾,这还是一个挖坑的问题,解决方案并不是很确定. 需求是,大多数的语言都提供import包或module的功能,避免全部代码写到一个文件中,方便管理与维护. 如常用的database模块,每次写R ...

  7. UWB DWM1000 跟随小车原理---一张图演示

    更多内容参考论坛:bphero.com.cn

  8. 制作docker-jdk7-zookeeper镜像(非集群版)

    ## 准备工作 用到的工具, Xshell5, Xftp5, jdk-7u79-linux-x64.tar.gz, zookeeper-3.4.9.tar.gz, docker.io/centos:l ...

  9. Helm 入门指南

    Helm 为Kubernetes的软件包管理工具,Helm有两部分组成:Helm客户端.Tiller服务端,Helm三个主要部件:Chart.仓库.Release: Chart:为Kubernetes ...

  10. python d:\test.py File "<stdin>", line 1 python d:\test.py ^ SyntaxError: invalid syntax

    pyhton出错: python d:\test.py File "<stdin>", line 1 python d:\test.py ^SyntaxError: i ...