2015-01-21 3 views
0

Проблема я столкнулся в том, что Scrapy код, в частности, трубопровод представляет меня с ошибкой программирования mysql.connector.errors.ProgrammingError: Not all parameters were used in the SQL statement'Scrapy ProgrammingError: Не были использованы все параметры в операторе SQL

Это мой код для трубопровода:

import csv 
from scrapy.exceptions import DropItem 
from scrapy import log 
import sys 
import mysql.connector 

class CsvWriterPipeline(object): 

    def __init__(self): 
     self.connection = mysql.connector.connect(host='localhost', user='test', password='test', db='test') 
     self.cursor = self.connection.cursor() 

    def process_item(self, item, spider): 
     self.cursor.execute("SELECT title, url FROM items WHERE title= %s", item['title']) 
     result = self.cursor.fetchone() 
     if result: 

      log.msg("Item already in database: %s" % item, level=log.DEBUG) 
     else: 
      self.cursor.execute(
       "INSERT INTO items (title, url) VALUES (%s, %s)", 
        (item['title'][0], item['link'][0])) 
      self.connection.commit() 

      log.msg("Item stored : " % item, level=log.DEBUG) 
     return item 

    def handle_error(self, e): 
      log.err(e) 

Это дает мне эту точную ошибку, когда я запускаю паука. http://hastebin.com/xakotugaha.py

Как вы можете видеть, он четко сканирует, поэтому я сомневаюсь в чем-то неправильном с пауком.

В настоящее время я использую Scraw web crawler с базой данных MySql. Спасибо за вашу помощь.

ответ

1

Ошибка возникает, когда вы делаете запрос SELECT. Существует единственный заполнитель в запросе, но item['title'] список строк - имеет несколько значений:

self.cursor.execute("SELECT title, url FROM items WHERE title= %s", item['title']) 

Корневая проблема на самом деле идет от паука. Вместо того, чтобы возвращать один элемент с несколькими ссылками и заголовками - вам нужно вернуть отдельный элемент для каждой ссылки и названия.


Вот код паука, который должен работать для вас:

import scrapy 

from scrapycrawler.items import DmozItem 


class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["snipplr.com"] 

    def start_requests(self): 
     for i in range(1, 146): 
      yield self.make_requests_from_url("https://snipt.net/public/?page=%d" % i) 

    def parse(self, response): 
     for sel in response.xpath('//article/div[2]/div/header/h1/a'): 
      item = DmozItem() 
      item['title'] = sel.xpath('text()').extract() 
      item['link'] = sel.xpath('@href').extract() 
      yield item 
+0

Я вижу, как хотелось бы идти об этом? он работал раньше, но почему-то переставал работать. Это код паука, если он вам нужен: http://hastebin.com/yalivovifo.py – CharlieC

+0

ah, делает 'для sel в response.xpath ('// article/div [2]/div/header/h1/a '): 'есть какая-либо разница по сравнению с этим? 'sel = Selector (response)' – CharlieC

+0

@CharlieC это просто, что вам нужно получить экземпляры экземпляра изнутри цикла для каждой ссылки. Надеюсь, что все сработает. – alecxe

Смежные вопросы