Python scrapy-itemloader-mysql
我开始学刮痧了。我想使用一个项目加载器并将一些数据写入MySQL。当我在items.py中为输出处理器使用参数“TakeFirst()”时,下面的代码工作得非常好。但是,我需要将所有条目都添加到MySQL,而不仅仅是第一个条目。当我使用参数“MapCompose()”时,会收到以下与MySQL相关的错误消息: 错误1241:操作数应包含1列 我需要如何修改代码以将所有条目写入MySQL 测试_.py:Python scrapy-itemloader-mysql,python,mysql,scrapy,Python,Mysql,Scrapy,我开始学刮痧了。我想使用一个项目加载器并将一些数据写入MySQL。当我在items.py中为输出处理器使用参数“TakeFirst()”时,下面的代码工作得非常好。但是,我需要将所有条目都添加到MySQL,而不仅仅是第一个条目。当我使用参数“MapCompose()”时,会收到以下与MySQL相关的错误消息: 错误1241:操作数应包含1列 我需要如何修改代码以将所有条目写入MySQL 测试_.py: import scrapy from scrapy.contrib.spiders impor
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from tutorial.items import TestItem
from scrapy.loader import ItemLoader
class TestCrawlSpider(CrawlSpider):
name = "test_crawl"
allowed_domains = ["www.immobiliare.it"]
start_urls = [
"http://www.immobiliare.it/Roma/case_in_vendita-Roma.html?criterio=rilevanza"
]
rules = (
Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="no-decoration button next_page_act"]',)), callback="parse_start_url", follow= True),
)
handle_httpstatus_list = [302]
def parse_start_url(self, response):
l = ItemLoader(item=TestItem(), response=response)
l.add_xpath('price', '//*/div[1]/div[1]/div[4]/strong/text()')
l.add_xpath('rooms', '//*/div[1]/div[1]/div[7]/div[1]/span[4]/text()')
return l.load_item()
items.py:
import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join
class TestItem(scrapy.Item):
price = scrapy.Field(
output_processor=TakeFirst(),
)
rooms = scrapy.Field(
output_processor=TakeFirst(),
)
pipelines.py:
import sys
import MySQLdb
import hashlib
from scrapy.http import Request
from tutorial.items import TestItem
class MySQLPipeline(object):
def __init__(self):
self.conn = MySQLdb.connect(user='XXX', passwd='YYY', host='localhost', db='ZZZ')
self.cursor = self.conn.cursor()
def process_item(self, item, test_crawl):
print item
return item
try:
self.cursor.execute("INSERT INTO test_table (price, rooms) VALUES (%s, %s)", (item['price'], item['rooms']))
self.conn.commit()
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
return item
您需要将
string
值传递给mysql,这就是TakeFirst()
起作用的原因,因为它转换加载程序中的列表,并且只获取第一个元素(这是正常的过程,因为它通常会获取类似['myvalue']
的人员,在这种情况下,只获取第一个元素完全可以)
现在,如果要将列表输入数据库,请说['a','b','c']
,您需要定义如何将其序列化为字符串,例如:
'a;b;c' # join the list elements with ';' -> ';'.join(['a', 'b', 'c'])
这是您需要定义的,因为稍后从数据库查询时,您必须相应地取消搜索:
'a;b;c'.split(';') -> ['a' ,'b', 'c']
要使用我的示例,您可以在加载程序上使用如下内容:
class TestItem(scrapy.Item):
price = scrapy.Field(
output_processor=Join(';'),
)
rooms = scrapy.Field(
output_processor=Join(';'),
)
您需要将
string
值传递给mysql,这就是TakeFirst()
起作用的原因,因为它转换加载程序中的列表,并且只获取第一个元素(这是正常的过程,因为它通常会获取类似['myvalue']
的人员,在这种情况下,只获取第一个元素完全可以)
现在,如果要将列表输入数据库,请说['a','b','c']
,您需要定义如何将其序列化为字符串,例如:
'a;b;c' # join the list elements with ';' -> ';'.join(['a', 'b', 'c'])
这是您需要定义的,因为稍后从数据库查询时,您必须相应地取消搜索:
'a;b;c'.split(';') -> ['a' ,'b', 'c']
要使用我的示例,您可以在加载程序上使用如下内容:
class TestItem(scrapy.Item):
price = scrapy.Field(
output_processor=Join(';'),
)
rooms = scrapy.Field(
output_processor=Join(';'),
)
您需要为列表中的每个条目创建一个项目,如下所示:
import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class TestCrawlSpider(CrawlSpider):
name = "test_crawl"
allowed_domains = ["www.immobiliare.it"]
start_urls = [
"http://www.immobiliare.it/Roma/case_in_vendita-Roma.html?criterio=rilevanza"
]
rules = (
Rule(LinkExtractor(allow=(), restrict_xpaths=('//a[@class="no-decoration button next_page_act"]',)), callback="parse_start_url", follow= True),
)
handle_httpstatus_list = [302]
def parse_start_url(self, response):
for selector in response.css('div.content'):
l = ItemLoader(item=TestItem(), selector=selector)
l.add_css('price', '.price::text')
l.add_css('rooms', '.bottom::text, .bottom span::text', re=r'.*locali.*')
yield l.load_item()
我对选择器做了一些更改,以便您可以检查其他可能性(在学习scrapy的同时),但这可能不是您想要提取的信息。您需要为列表中的每个条目创建一个项目,如下所示:
import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class TestCrawlSpider(CrawlSpider):
name = "test_crawl"
allowed_domains = ["www.immobiliare.it"]
start_urls = [
"http://www.immobiliare.it/Roma/case_in_vendita-Roma.html?criterio=rilevanza"
]
rules = (
Rule(LinkExtractor(allow=(), restrict_xpaths=('//a[@class="no-decoration button next_page_act"]',)), callback="parse_start_url", follow= True),
)
handle_httpstatus_list = [302]
def parse_start_url(self, response):
for selector in response.css('div.content'):
l = ItemLoader(item=TestItem(), selector=selector)
l.add_css('price', '.price::text')
l.add_css('rooms', '.bottom::text, .bottom span::text', re=r'.*locali.*')
yield l.load_item()
我对选择器做了一些更改,以便您可以检查其他可能性(同时了解scrapy),但可能这不是您想要提取的信息。谢谢您的回答。在将数据写入MySQL时,我希望列表中的每个元素都单独列在一行中。谢谢您的回答。在将数据写入MySQL时,我希望列表中的每个元素都单独列在一行中。谢谢,我正在寻找这个解决方案。谢谢,我正在寻找这个解决方案。