scrapy的一点总结

scrapy的相关知识

最近复习了一下scrapy的内容,发现好多知识点还没有完全掌握,再来巩固巩固。

一、scrapy的使用

  1. 创建项目:命令行输入scrapy startproject ×××
  2. 进入项目:cd 文件夹名(就是创建项目时的文件夹)
  3. 创建爬虫:scrapy genspider 爬虫名 xxx.com (爬取域)
  4. 运行爬虫:scrapy crawl 爬虫名字

二、scrapy的组成

1.scrapy Engine:引擎,是总指挥:负责数据和信号在不同模块间的传递,scrapy已经实现
2.Scheduler:调度器,一个队列,存放引擎发过来的request请求,scrapy已经实现
3.DownLoader:下载器,下载引擎发过来的request请求,并把结果发送给引擎,scrapy已经实现
4.Spider:爬虫,处理引擎发过来的response请求,提取数据和url,并交给引擎,需要手写
5.Item Pipeline:管道,处理引擎发过来的数据,需要手写
6.DownLoader Middlewares:下载中间件,可以自定义扩展,例如设置代理,一般不用手写
7.Downloader Middlewares:下载中间件,是处于Scrapy的Request和Requesponse之间的处理模块
8.Spider Middlewares:spider中间件,位于引擎和spider之间的框架,主要处理spider输入的响应和输出的结果及新的请求middlewares.py里实现

三、scrapy的运行流程

1.spider的yeild将request发送给Engine
2.Engine对request不做任何处理发送给Scheduler
3.scheduler生成request交给Engine
4.Engine拿到request,通过Middleware进行层层过滤发送给Downloader
5.Downloader在网上获取到response数据之后,又经过Middleware进行层层过滤发送给Engine
6.Engine获取到response数据之后,返回给Spider,Spider的parse()方法对获取到的response数据进行处理,解析出items或者requests
7.将解析出来的items或者requests发送给Engine
8.Engine获取到items或者requests,将items发送给Itempipeline,将requests发送给Scheduler
这个可以想象成你去餐厅点餐,引擎就是服务员,你吃的什么饭告诉服务员,spider就是柜台,把你点的餐(网站),交给厨师(下载器)来做,由于每个人的点餐顺序不同,调度器按照时间顺序来决定什么时候上菜。

四、实战演练

# -*- coding: utf-8 -*-

# 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
#新片场

# pipeline文件
# -*- coding: utf-8 -*-

import csv
from Xpc.items import PostItem, CommentItem, CopyItem
import pymysql
from redis import Redis
import os

class XpcPipeline(object):
    def __init__(self):
        # 当前文件的上一级
        store_file = os.path.dirname(__file__) + '/xpc.csv'
        # 打开文件
        self.file = open(store_file, 'w', newline="")
        # csv 写法
        self.writer = csv.writer(self.file)

    def open_spider(self, spider):
        print("pipeline 开始爬虫......")
  

  # 执行多个不同的item时
    def process_item(self, item, spider):
        if isinstance(item, PostItem):
            print("这是发布信息:", item)
        elif isinstance(item, CommentItem):
            print("这是评论信息:", item)
        elif isinstance(item, CopyItem):
            print("这是版权信息:", item)
        return item  # 返回给下一个要执行的管道类

    def close_spider(self, spider):
        print("pipeline 结束爬虫......")

# 连接数据库
class MysqlPipeline(object):
    conn = None
    cursor = None

    def open_spider(self, spider):
        self.conn = pymysql.Connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='',
            db='test_db',
            charset='utf8'
        )
        print("数据库连接成功")

    def process_item(self, item, spider):
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute('insert into test_db values("%s", "%s")' % (item['author'], item['content']))
            self.conn.commit()
        except Exception as e:
            print("数据库插入异常:", e)
            print("数据库执行回滚")
            self.conn.rollback()
        return item

    def close_spider(self, spider):
        print("断开数据库连接")
        self.cursor.close()
        self.conn.close()

# 连接数据库
class RedisPipeline(object):
    conn = None
    cursor = None

    def open_spider(self, spider):
        self.conn = Redis(
            host='127.0.0.1',
            port=6379
        )
        print("数据库连接成功")

    def process_item(self, item, spider):
        dic = {
            "author": item["author"],
            "content": item["content"]
        }
        self.conn.lpush("队列名字", dic)

    def close_spider(self, spider):
        print("断开数据库连接")
        self.cursor.close()
        self.conn.close()


    

如有错误,欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值