Python爬虫入门【18】: 36氪(36kr)数据抓取 scrapy

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 = 201

for 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 csv

class 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多条,问题不大,原因没细查。

相关推荐

DJ音乐网站排名及推荐
bt365体育投注

DJ音乐网站排名及推荐

2025-07-12 👁️ 7303
巴西对法国世界杯历史战绩
365365bet体育在线

巴西对法国世界杯历史战绩

2025-07-14 👁️ 7893
皇上吉祥漫画免费在线阅读「下拉式观看」
手机版office365破解版

皇上吉祥漫画免费在线阅读「下拉式观看」

2025-07-09 👁️ 9054
哇叽壁纸电脑版下载-哇叽壁纸正版软件免费下载-哇叽壁纸版本大全
卡牌皮肤鉴赏手册:精选卡牌皮肤价格指南(至2025年)
手机版office365破解版

卡牌皮肤鉴赏手册:精选卡牌皮肤价格指南(至2025年)

2025-07-03 👁️ 4576
DNF2025五一套奶职业提升一览
bt365体育投注

DNF2025五一套奶职业提升一览

2025-07-18 👁️ 8325