Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy

简介: 1. 36氪(36kr)数据----写在前面今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数据分析博文,记得关注哦~36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去。

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

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

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

网址 https://36kr.com/

image

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

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

image

捕获链接如下

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就是页码,这个不断循环叠加即可。

image

上面的参数还有一个更加重要的值,叫做total_count 总共有多少文章数目。有这个参数,我们就能快速的拼接出来,想要的页码了。

3. 36氪(36kr)数据----创建scrapy项目

scrapy startproject kr36 

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

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

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_countmobile_views_countviews_countfavourite_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()

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

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

image

更多内容,欢迎关注 https://dwz.cn/r4lCXEuL

相关文章
|
26天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
27天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
28天前
|
数据采集 Web App开发 监控
高效爬取B站评论:Python爬虫的最佳实践
高效爬取B站评论:Python爬虫的最佳实践
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
87 6
|
29天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
1月前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
56 7
|
1月前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
1月前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
176 1
|
1月前
|
数据采集 中间件 API
在Scrapy爬虫中应用Crawlera进行反爬虫策略
在Scrapy爬虫中应用Crawlera进行反爬虫策略
|
19天前
|
数据采集 JavaScript 程序员
探索CSDN博客数据:使用Python爬虫技术
本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
59 0