scrapy异步写入mysql_scrapy 异步写入mysql和 ItemLoader的基本使用和

scrapy 异步写入mysql和 ItemLoader的基本使用和

ItemLoader的基本使用

使用itemloader能够提高scrapy在解析数据时的便利性和提升代码的可维护性,itemloader和Field的使用可以更好的提升代码的可读性。

class QuanshuSpider(scrapy.Spider):

name = 'quanshu'

# allowed_domains = ['quanshu.92kaifa.com']

start_urls = ['http://quanshu.92kaifa.com/']

def parse(self, response, **kwargs):

article_list = response.xpath('//ul[@class="b-all-content cf"]/li')

for article in article_list:

# title = scrapy.Field()

# image_url = scrapy.Field()

# type = scrapy.Field()

# author = scrapy.Field()

# id = scrapy.Field()

item_loader = ItemLoader(item=BookItem(), response=response)

item_loader.add_value('title', article.xpath('a[@class="msgBorder"]/@title').get())

item_loader.add_value('image_url', article.xpath('a[@class="msgBorder"]/img/@src').get())

item_loader.add_value('type', article.xpath('a[3]/text()').get())

item_loader.add_value('id', article.xpath('a[@class="msgBorder"]/@href').get())

item_loader.add_value('author', article.xpath('a[4]/text()').get())

item = item_loader.load_item()

yield item

spider文件

import scrapy

import re

from scrapy.loader.processors import TakeFirst, MapCompose

class BookItem(scrapy.Item):

title = scrapy.Field(output_processor=TakeFirst())

image_url = scrapy.Field(output_processor=TakeFirst())

type = scrapy.Field(output_processor=TakeFirst())

author = scrapy.Field(output_processor=TakeFirst())

id = scrapy.Field(

input_processor=MapCompose(lambda x: re.findall('\d+', x)),

output_processor=TakeFirst()

)

item文件

scrapy异步写入mysql

from twisted.enterprise import adbapi

import MySQLdb

import MySQLdb.cursors

class BookPipeline:

def __init__(self, **kwargs):

self.db_pool: adbapi.ConnectionPool = kwargs.get('db_pool')

@classmethod

def from_settings(cls, settings):

# MYSQL_CONFIG = {

# 'host': 'localhost',

# 'user': 'root',

# 'passwd': 'qwe123',

# 'db': 'scrapy_test',

# 'charset': 'utf8',

# }

config = settings['MYSQL_CONFIG']

config['cursorclass'] = MySQLdb.cursors.DictCursor

config['use_unicode'] = True

db_pool = adbapi.ConnectionPool('MySQLdb', **config)

return cls(db_pool=db_pool)

def process_item(self, item, spider):

instance = self.db_pool.runInteraction(self.insert, item)

instance.addErrback(self.handle_err, item, spider)

return item

def insert(self, cursor, item):

sql = f"""

INSERT INTO books

(

`title`,

`image_url`,

`type`,

`author`,

`id`

) VALUES

(

"{item['title']}",

"{item['image_url']}",

"{item['type']}",

"{item['author']}",

"{item['id']}"

)

"""

cursor.execute(sql)

def handle_err(self, error, item, spider):

"""处理异常"""

print(error)

结合mysqldb和twisted一起可以让写入mysql数据库的操作异步化,最后在setting里面打开这个pipline即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值