Scrapy 在一行上将碎片输出到MySql
我很难在数据库的多行上输出结果。我知道如何在导出到json文件时使其循环,但由于我是scrapy的noob,我遵循了一些关于导出到数据库的语法的教程,但它将返回的数据全部放在一行上。 这是我的蜘蛛代码Scrapy 在一行上将碎片输出到MySql,scrapy,mysql-python,scrapy-pipeline,Scrapy,Mysql Python,Scrapy Pipeline,我很难在数据库的多行上输出结果。我知道如何在导出到json文件时使其循环,但由于我是scrapy的noob,我遵循了一些关于导出到数据库的语法的教程,但它将返回的数据全部放在一行上。 这是我的蜘蛛代码 import scrapy from ..items import SandboxItem class IndigoSpider(scrapy.Spider): name = 'Indigo' start_urls = ['https://www.chapters.indigo
import scrapy
from ..items import SandboxItem
class IndigoSpider(scrapy.Spider):
name = 'Indigo'
start_urls = ['https://www.chapters.indigo.ca/en-ca/books/?link-usage=Header%3A%20books&mc=Book&lu=Main']
def parse(self, response):
items = SandboxItem()
Product_Name= str(response.css('.product-list__product-title-link--grid::text').getall()),
Product_Author= str(response.css('.product-list__contributor::text').getall()),
Product_Price= str(response.css('.product-list__price--orange::text').getall()),
Product_Image= str(response.css('.product-image--lazy::attr(src)').getall())
items['Product_Name'] = Product_Name
items['Product_Author'] = Product_Author
items['Product_Price'] = Product_Price
items['Product_Image'] = Product_Image
yield items
这是我的管道代码
import mysql.connector
class SandboxPipeline(object):
def __init__(self):
self.create_connection()
self.create_table()
# pass
def create_connection(self):
self.conn = mysql.connector.connect(
host='localhost',
user='root',
passwd='test123',
database='python',
auth_plugin='mysql_native_password'
)
self.curr = self.conn.cursor()
def create_table(self):
self.curr.execute(""" DROP TABLE IF EXISTS indigo""")
self.curr.execute(""" Create table indigo(
Product_Name text,
Product_Author text,
Product_Price text,
Product_Image text
)""")
def process_item(self, item, spider):
self.store_db(item)
# print("pipelinexds:" + str(item['Product_Name']))
# print(str(item['Product_Name']))
return item
#
def store_db(self, item):
self.curr.execute("""Insert Into indigo values (%s,%s,%s,%s)""",
((item['Product_Name'][0]),
(item['Product_Author'][0]),
(item['Product_Price'][0]),
(item['Product_Image'][0]),
)
)
self.conn.commit()
.看起来您的
项目确实包含多个项目。
所以您需要在某个地方包含for
循环,以更改程序的体系结构
我建议使用以下方法:
for i in len(Product_Name):
yield {
'Product_Name': Product_Name[i],
'Product_Author': Product_Author[i],
'Product_Price': Product_Price[i],
'Product_Image': Product_Image[i]
}
所以该项将包含单个值。这应该得到适当的处理
def parse(self, response):
items = SandboxItem()
Product_Name= str(response.css('.product-list__product-title-link--grid::text').getall()),
Product_Author= str(response.css('.product-list__contributor::text').getall()),
Product_Price= str(response.css('.product-list__price--orange::text').getall()),
Product_Image= str(response.css('.product-image--lazy::attr(src)').getall())
for i in len(Product_Name):
yield {
'Product_Name': Product_Name[i],
'Product_Author': Product_Author[i],
'Product_Price': Product_Price[i],
'Product_Image': Product_Image[i]
}
它将所有产生的项目放在一行数据库中?是的,它将所有收集到的数据连接在一行中谢谢你的回复Michael,你能告诉我应该把循环放在哪里吗?它应该在我的css代码所在的爬行器中,还是在其他地方?感谢Michael对延迟响应表示抱歉,但这似乎不会导致数据流向数据库。