【scrapy框架】爬取内容后写入数据库

0 基本逻辑

python 复制代码
1 创建项目 scrapy startproject 项目名字
2 cd 到spiders文件夹下
3 创建爬虫文件
  scrapy genspider -t crawl 爬虫文件名字 爬取的域名

1 settings.py文件中设置日志文件

python 复制代码
# 一般不采取这种方式
# LOG_LEVEL = 'WARNING' 
# 推荐使用日志文件的方式
LOG_FILE = 'log.log'

2 使用scrapy爬取读书网的中书的名字和图片地址

2.1 新建项目

python 复制代码
scrapy startproject 项目名字

2.2 新建爬虫名字

python 复制代码
scrapy genspidef 爬虫名字 域名  # 域名,如www.baidu.com

2.3 在爬虫文件中写爬取逻辑

python 复制代码
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from read_book.items import ReadBookItem


class ReadbookSpider(CrawlSpider):
    name = "read_book"
    allowed_domains = ["www.dushu.com"]
    start_urls = ["https://www.dushu.com/book/1188_1.html"]

    rules = (
        Rule(LinkExtractor(allow=r"/book/1188_\d+\.html"),
                          callback="parse_item",
                          follow=True),  
    )

    def parse_item(self, response):
        img_list = response.xpath('//div[@class="bookslist"]//img')
        for img in img_list:
            name = img.xpath('./@data-original').extract_first()
            src = img.xpath('./@alt').extract_first()

            book = ReadBook101Item(name=name, src=src)
            yield book

2.4 items.py文件中

python 复制代码
import scrapy


class ReadBookItem(scrapy.Item):
 
    name = scrapy.Field()
    src = scrapy.Field()

2.5 pipelines.py文件中

python 复制代码
from itemadapter import ItemAdapter
from scrapy.utils.project import get_project_settings  # 加载settings文件
import pymysql


class ReadBook101Pipeline:
    def open_spider(self, spider):
        self.fp = open('book.json', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        self.fp.write(str(item))
        return item

    def close_spider(self, spider):
        self.fp.close()


class MysqlPipeline:

    def open_spider(self, spider):
        settings = get_project_settings()
        self.host = settings['DB_HOST']
        self.user = settings['DB_USER']
        self.password = settings['DB_PASSWORD']
        self.name = settings['DB_NAME']
        self.port = settings['DB_PORT']
        self.charset = settings['DB_CHARSET']

        self.connect()

    def connect(self, ):
        self.conn = pymysql.connect(
            user=self.user,
            password=self.password,
            host=self.host,
            database=self.name,
            port=self.port,
            charset=self.charset,
        )

        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        sql = 'insert into book(name,src) values("{}","{}")'.format(
            item['name'], item['src']
        )
        self.cursor.execute(sql)
        self.conn.commit()
        return item

    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()

2.6 settings文件中开启管道、配置数据库

python 复制代码
DB_HOST = '127.0.0.1'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = 'root'
DB_NAME = 'spider01'
# utf-8不允许使用 - 否则会报错NoneType......
DB_CHARSET = 'utf8'


# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   "read_book_101.pipelines.ReadBook101Pipeline": 300,
   'read_book_101.pipelines.MysqlPipeline': 301
}
相关推荐
仍然.7 小时前
Redis---缓存
数据库·redis·缓存
Aloudata8 小时前
LookML 语义模型 vs 企业级独立语义层:BI 建模语言能否承担企业语义底座?
数据库·人工智能·数据分析·数据资产·dataagent
细嗅蔷薇@8 小时前
排序和分⻚(order by 、limit)
数据库·oracle
wdfk_prog8 小时前
LWIP教程 09:从 `tcp_slowtmr()` 到 Fast Retransmit——TCP 超时重传与重复 ACK
服务器·网络·数据库·网络协议·tcp/ip
逸模8 小时前
BIM在连锁餐饮装修中的应用:不只是画三维图
大数据·数据库·人工智能·物联网·建模
bug和崩溃我都要8 小时前
QT 开发的专业截图录屏工具 - macOS版 / Windows版
windows·qt·mac·录屏·截屏
梦想平凡8 小时前
棋牌游戏技术实战(五):从对局事件重新执行规则,核对棋盘和最终状态
数据库·游戏·oracle
kimloner8 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
小白学大数据8 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
白露与泡影8 小时前
Oracle AI Database 26ai RAC 部署步骤、关键命令与一键脚本
数据库·人工智能·oracle