这次要爬取的是 ITFun 的新闻列表以及文章内页,Api 文档地址: https://www.yuque.com/itfun/api/news

使用 Shell 分析接口

scrapy shell https://itfun.tv/api/v1/news.json\?page\=1
>>> import json
>>> json.loads(response.text)
>>> json.loads(response.text)['notices']

可以看到数据存在了 notices

新建项目

scrapy startproject NoticeSpider

创建蜘蛛

cd NoticeSpider
scrapy genspider notice "itfun.tv"

修改 items.py

import scrapy


class NoticeItem(scrapy.Item):
    notice = scrapy.Field()

    user = scrapy.Field()

    category = scrapy.Field()

修改 settings

开启 pipelines

ITEM_PIPELINES = {
   'NoticeSpider.pipelines.NoticespiderPipeline': 300,
}

修改爬虫文件 notice.py

import scrapy, json
from NoticeSpider.items import NoticeItem


class NoticeSpider(scrapy.Spider):
    name = 'notice'
    allowed_domains = ['itfun.tv']
    start_urls = ['https://itfun.tv/api/v1/news.json?page=1']

    def __init__(self):
        # 默认是第一页
        self.page = 1

    # 列表页
    def parse(self, response):
        notices = json.loads(response.text)['notices']

        # 如果没有数据,表示已经到最后一页,停止爬虫
        if not notices:
            return

        for notice in notices:
            # 获取到的新闻 id,拼接内页接口地址
            notice_show_url = 'https://itfun.tv/api/v1/news/' + str(notice['id']) + '.json'

            # 爬取内页,将爬取到的数据,转交给 parse_show 解析数据
            yield scrapy.Request(notice_show_url, callback=self.parse_show)

        # 分页,页面数自增
        self.page += 1
        next_page = 'https://itfun.tv/api/v1/news.json?page=' + str(self.page)

        yield scrapy.Request(next_page, callback=self.parse)

    # 内页
    def parse_show(self, response):
        item = NoticeItem()
        item['notice'] = json.loads(response.text)['notice']
        item['user'] = json.loads(response.text)['user']
        item['category'] = json.loads(response.text)['category']
        yield item

修改 pipelines

class NoticespiderPipeline(object):
    def process_item(self, item, spider):
        print(item['notice']['title'])
        # print(item['notice'])
        # print(item['user'])
        # print(item['category'])

运行爬虫

scrapy crawl notice 

可以看到爬取了所有的数据。这时候,你可以使用之前学过的知识,导出 json 或存入数据库了。