免责声明:本文仅做演示与分享...
目录
基于命令存储的解析方法:
settings.py
blibli.py
基于管道存储的解析方法:
1-在爬虫文件中进行数据解析
2-在items.py定义相关属性
3-在 爬虫文件中 把 解析的数据存储封装到item类型对象中
4-把item类型对象提交给管道
5-在管道文件中,接收爬虫文件提交过来的item类型对象
保存到Excel中:
保存到数据库(mysql)中:
6-配置文件中开启管道
b站热度排行榜
基于命令存储的解析方法:

--只需修改图中画圈的文件即可.
settings.py
根据需要自己设置.
(伪装头,君子协议,日志输出)...
blibli.py
import scrapy
from scrapy_demo1.items import ScrapyDemo1Item
# 找到数据所在的URL
# 执行项目
class BlibliSpider(scrapy.Spider):
    name = "blibli"
    # allowed_domains = ["blibli.com"]
    start_urls = [
        "https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all&web_location=333.934&w_rid=6d0af3cab734841a471545ef10d2a0f0&wts=1724383027"
    ]
    # 基于命令存储的解析方法
    def parse(self, response):
        ls = []
        # pass
        # 如果请求的url的响应内容为json数据,也可以直接调用json()方法获取数据
        # print(response.json())  # 字典类型
        data = response.json()
        # print(data)
        for d in data["data"]["list"]:
            aid = d["aid"]
            desc = d["desc"]
            title = d["title"]
            name = d["owner"]["name"]
            # print(aid, desc, title, name)
            # 一次性返回100条数据, [{},{},{},{}]
            dict = {
                "视频id": aid,
                "视频标题": title,
                "视频描述": desc,
                "视频作者": name,
            }
            ls.append(dict)
        return ls---返回一个对象之后,直接 scrapy crawl blibli -o blibli.csv 即可.
基于管道存储的解析方法:

复杂点 -->
1-在爬虫文件中进行数据解析

import scrapy
from scrapy_demo1.items import ScrapyDemo1Item
# 找到数据所在的URL
# 执行项目
class BlibliSpider(scrapy.Spider):
    name = "blibli"
    # allowed_domains = ["blibli.com"]
    start_urls = [
        "https://api.bilibili.com/x/web-interface/ranking/v2?rid=0&type=all&web_location=333.934&w_rid=6d0af3cab734841a471545ef10d2a0f0&wts=1724383027"
    ]
    # 基于管道存储的解析方法
    def parse(self, response):
        data = response.json()
        for d in data["data"]["list"]:
            aid = d["aid"]
            desc = d["desc"]
            title = d["title"]
            name = d["owner"]["name"]
            # 类名() ScrapyDemo1Item() 实例化
            item = ScrapyDemo1Item()
            # 把解析出来的数据存入到对象中: 对象名.属性名 = 数据
            # !!!!!!!!!!!
            # 不能按对象的属性添加. 而要放到字典中, 然后再把字典传给item对象.
            item["bvid"] = aid
            item["title"] = title
            item["desc"] = desc
            item["name"] = name
            # 调用yield将数据传递给管道; return则不会传递给管道. return,yield
            yield item  # 数据有多少条就提交多少次.
2-在items.py定义相关属性
(你要保存什么数据,就定于什么属性.)
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class ScrapyDemo1Item(scrapy.Item):  # 类名可以自定义,但是必须继承scrapy.Item
    # define the fields for your item here like:
    # 类中定义属性,定义几个属性,取决于你
    bvid = scrapy.Field()  # 字段
    # 属性名可以自定义,建议和解析时的一样.
    title = scrapy.Field()
    desc = scrapy.Field()
    name = scrapy.Field()
3-在 爬虫文件中 把 解析的数据存储封装到item类型对象中
 
 
4-把item类型对象提交给管道
yield item # 数据有多少条就提交多少次.
5-在管道文件中,接收爬虫文件提交过来的item类型对象
(默认的类只针对保存到txt里面.)
保存到 Excel / 数据库 中 需要自己定义类.
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
class ScrapyDemo1Pipeline:  # 如果自定义类名,在配置文件中也要修改.
    # 打开 , 写入 , 关闭.
    def open_spider(self, spider):
        print("爬虫开始")
        # 打开文件: 只能用 open
        # 添加属性:当对象中没有该属性时,才会添加.  修改属性:当对象中有f属性时.
        self.f = open("b站2.txt", "w", encoding="utf-8")
    def process_item(self, item, spider):  # item 是爬取的item, spider 是爬虫对象.
        # yield 提交多少次,就会执行多少次process_item函数.
        # print(1)
        # 保存到记事本文件中    w :覆盖模式   a :追加模式
        # 浪费资源 ---多次打开和关闭.
        # with open("b站.txt", "a", encoding="utf-8") as f:
        #     # item 不是字符串.  write() 方法需要字符串参数.
        self.f.write(f"{item['bvid']}\n{item['title']}\n{item['desc']}\n{item['name']}")
        return item  # 是否提交给下一个管道类 (优先级)
        # print(3)
        # pass
    # 一次打开,多次写入:
    def close_spider(self, spider):
        self.f.close()
        print("爬虫结束")
保存到Excel中:
后面的设置别忘了配置一下.
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import openpyxl
# 自定义管道类--保存到excel文件中.
class ExcelPipeline:
    # 创建工作薄对象 1
    # 选择工作表    1
    # 添加表头    1
    # 写入数据    多
    # 保存文件    1
    def open_spider(self, spider):
        self.wb = openpyxl.Workbook()
        self.sheet = self.wb.active
        self.sheet.append(["视频id", "视频标题", "描述", "作者"])
    def process_item(self, item, spider):
        self.sheet.append([item["bvid"], item["title"], item["desc"], item["name"]])
    def close_spider(self, spider):
        self.wb.save("b站排行榜数据.xlsx")
保存到数据库(mysql)中:
后面的设置别忘了配置一下.
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
# 保存到数据库中:
import pymysql
# utf8mb4 解决表情包问题.
class MySQLPipeline:
    # 创建连接对象 1
    # 创建游标对象 1
    # 插入数据 多
    # 提交事务 1
    # 关闭游标 1
    # 关闭连接 1
    conn = ""
    cur = ""
    def open_spider(self, spider):
        # 连接数据库
        self.conn = pymysql.connect(
            host="127.0.0.1", user="root", password="root", port=3306, database="test"
        )
        # 创建游标
        self.cursor = self.conn.cursor()
    def process_item(self, item, spider):
        try:
            # 插入数据
            sql = 'INSERT INTO blibli VALUES (NULL,"%s", "%s", "%s", "%s")' % (
                item["title"],
                item["desc"],
                item["bvid"],
                item["name"],
            )
            self.cursor.execute(sql)  # 执行后 出现有的数据插不进去,火星文.
            # 数据库中title字段默认使用的utf8 ,无法保存表情包,-->用utf8mb4.
            # 提交事务
            self.conn.commit()
        except Exception as e:
            print(sql)
            print(e)
            # 回滚事务
            self.conn.rollback()
    def close_spider(self, spider):
        if self.conn != "" and self.cur != "":
            # 关闭游标
            self.cursor.close()
            # 关闭连接
            self.conn.close()
        print("结束-------------")
6-配置文件中开启管道




















