首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抓取-项目加载器- mysql

问抓取-项目加载器- mysql
EN

Stack Overflow用户
提问于 2016-06-08 11:49:45
回答 2查看 805关注 0票数 0

我开始学刮痕了。我想使用项目加载器并将一些数据写入MySQL。当我在TakeFirst中对输出处理器使用参数"TakeFirst()“时,下面的代码非常好。但是,我需要将所有条目都输入到MySQL,而不仅仅是第一个条目。当我使用参数"MapCompose()“时,我会得到以下与MySQL相关的错误消息:

错误1241:操作数应包含1列

如何修改代码才能将所有条目写入MySQL?

test_crawlspider.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-08 14:14:47

您需要在清单中的每个条目创建一个条目,如下所示:

代码语言:javascript
复制
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()

我对选择器做了一些修改,以便您可以检查其他可能性(同时学习刮伤),但也许这不是您想要提取的信息。

票数 1
EN

Stack Overflow用户

发布于 2016-06-08 12:53:09

您需要将string值传递给mysql,这就是TakeFirst()工作的原因,因为它转换了加载程序中的列表,并且只获得了第一个元素(这是正常的过程,因为它通常会得到像['myvalue']这样的工作人员,在这种情况下,只获取第一个元素是完全可以的)。

现在,如果您想要将列表输入到数据库中,比如['a', 'b', 'c'],您需要定义如何将其序列化为字符串,例如:

代码语言:javascript
复制
 'a;b;c' # join the list elements with ';' -> ';'.join(['a', 'b', 'c'])

这是您需要定义的东西,因为稍后从数据库查询时,您必须相应地对其进行反分类:

代码语言:javascript
复制
 'a;b;c'.split(';') -> ['a' ,'b', 'c']

要使用我的示例,您可以在加载程序上使用这样的内容:

代码语言:javascript
复制
class TestItem(scrapy.Item):
    price = scrapy.Field(
        output_processor=Join(';'),
    )
    rooms = scrapy.Field(
        output_processor=Join(';'),
    )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37701691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档