首页 > 数据库 >Scrapy在pipeline中集成mongodb

Scrapy在pipeline中集成mongodb

时间:2023-07-17 11:57:47浏览次数:37  
标签:pipeline settings mongodb self item Scrapy bang123 MONGODB import

settings.py中设置配置项

MONGODB_HOST = "127.0.0.1"
MONGODB_PORT = 27017
MONGODB_DB_NAME = "bang123"

pipelines.py:

from scrapy.pipelines.images import ImagesPipeline
from itemadapter import is_item, ItemAdapter


class Bang123Pipeline:

    # 保存数据时的集合名
    COLLECTION_NAME = "t_bang123"

    def __init__(self):
        # 读取配置
        from scrapy.utils.project import get_project_settings
        from pymongo import MongoClient
        settings = get_project_settings()

        # Mongodb从settings.py中读取配置信息
        self.client = MongoClient(host=settings["MONGODB_HOST"], port=settings["MONGODB_PORT"])
        self.db = self.client[settings["MONGODB_DB_NAME"]]
        self.collection = self.db[self.COLLECTION_NAME]

    def __del__(self):
        self.client.close()

    def process_item(self, item, spider):

        if spider.name == "bang123":
            # 向mongodb中插入数据
            data_dict = ItemAdapter(item).asdict()
            insert_id = self.collection.insert_one(data_dict)
            print(f"{insert_id=}")
        else:
            print("不是bang123,不写入mongodb中")

        return item

爬虫文件:

import time

import scrapy
from scrapy.http import HtmlResponse
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from zolwallpaper.items import Bang123Item


class Bang123Spider(CrawlSpider):
    name = "bang123"
    allowed_domains = ["bang123.cn"]
    start_urls = ["https://www.bang123.cn/"]

    rules = (
        # 翻页
        Rule(LinkExtractor(allow=r"https://www.bang123.cn/index_\d+.html"), follow=True),
        # 详情页
        Rule(LinkExtractor(allow=r"https://www.bang123.cn/gongshi/\d+.html"), callback="parse_item", follow=False),
    )

    def parse_item(self, response: HtmlResponse):

        bang_item = Bang123Item()

        selector = response.xpath('//div[@class="article_content layui-field-box"]')[0]
        title = selector.xpath('./h1/text()').get()

        main = response.xpath('//div[@class="content tindent of_table"]/p').getall()

        bang_item["title"] = title
        bang_item["main"] = main

        print(f"【{title=}】")
        print(f"{main=}")
        print("-"*150)

        # 交给管道处理数据
        yield bang_item

标签:pipeline,settings,mongodb,self,item,Scrapy,bang123,MONGODB,import
From: https://www.cnblogs.com/juelian/p/17559674.html

相关文章

  • Scrapy如何在启动时向爬虫传递参数
    高级方法:一般方法:运行爬虫时使用-a传递参数scrapycrawl爬虫名-akey=values然后在爬虫类的__init__魔法方法中获取kwargsclassBang123Spider(RedisCrawlSpider):name="bang123"allowed_domains=["bang123.cn"]def__init__(self,*args,**kwargs):......
  • Scrapy框架爬取HTTP/2网站
    scrapy本身是自带支持HTTP2的爬取:https://docs.scrapy.org/en/latest/topics/settings.html?highlight=H2DownloadHandler#download-handlers-base需要把这个包安装一下#本身scrapy就是基于Twisted的,http2是一个拓展包Twisted[http2]>=17.9.0然后在settings.py中打开下载......
  • Scrapyd、scrapyd-client部署爬虫项目
    命令参考:https://github.com/scrapy/scrapyd-clienthttps://scrapyd.readthedocs.io安装组件pipinstallscrapydpipinstallscrapyd-clientScrapyd服务器端服务器端是可以有多个的,你爱多少个就搞多少个服务器端。部署scrapy时,可以手动指定部署到那个目标服务器端中。scr......
  • Scrapy框架架构
    ENGINE:引擎,负责各个组件的管理。SPIDERS:各个爬虫文件类。(我们一般要写的代码就是这个)。SCHEDULER:调度器,ENGINE将爬虫任务分发给该组件,由该组件调度爬虫任务。DOWNLOADER:下载器,用于接收SCHEDULER的任务,并向指定的URL发起请求然后返回响应数据给SPIDERS组件,交给SPIDER组件进一......
  • Scrapy创建项目、爬虫文件
    创建项目执行命令scrapystartproject<项目名>项目结构创建爬虫文件方式一:通过命令生成scrpaygenspider<爬虫名(必须唯一)><domain><爬虫名>:必须时唯一的<domain>:这个随意填,因为后期会修改爬虫文件中的start_url属性。方式二:在项目的spider包下,自己编写一......
  • Scrapy爬虫文件代码基本认识和细节解释
    importscrapyfromscrapy.http.requestimportRequestfromscrapy.http.response.htmlimportHtmlResponsefromscrapy_demo.itemsimportForumItemclassBaiduSpider(scrapy.Spider):#name必须是唯一的,因为运行一个爬虫是通过name来选择的。#你需要运行命......
  • mongodb副本集ip调整
    环境:Os:Centos7mongodb:4.4.22调整顺序:从节点-->仲裁节点-->主节点源ip与新ip对应关系(这里只拿修改从库作为例子)192.168.107-->192.168.104从节点 1.关闭从节点/usr/local/services/mongodb/bin/mongolocalhost:29001myrepl:SECONDARY>useadminmyrepl:SECONDARY>db.......
  • mongodb副本集(PSA模式)修改节点信息
    环境:OS:Centos7mongodb:4.4.22 我们在副本集扩容的情况下,新加入节点一般设置priority和votes都为0,待新节点数据同步完成后再进行修改:主库上执行新增新的节点:myrepl:PRIMARY>rs.add({host:"192.168.1.107:29001",priority:0,votes:0})待同步完成后查看副本集配置 ......
  • mongodb从库无法启动一例(replication_recovery.cpp)
    环境:OS:centos7mongodb:4.4.22背景:1主1从1仲裁的环境,修改从库的集群ip后,执行如下操作后发现无法启动myrepl:PRIMARY>rs.remove("192.168.1.104:29001")myrepl:PRIMARY>conf=rs.conf()myrepl:PRIMARY>conf.members[1].host="192.168.1.107:29001"myrepl:PRIMARY>rs.r......
  • MongoDB导入导出
    物理备份物理备份是指将MongoDB数据库文件复制到备份服务器或存储设备上。MongoDB使用的是一种称为"copy-on-write"的技术,这意味着当修改MongoDB数据库时,MongoDB会将数据复制到一个新的文件中,而原始文件仍然保留不变。这使得可以在不中断服务的情况下备份MongoDB数据库。 物理......