私のスパイダーにthis pipelineを実装しようとしました。 必要な依存関係をインストールした後、私はスパイダーをエラーなく実行できますが、なんらかの理由でデータベースに書き込まれません。パイプラインはMySQLに書き込まれませんが、エラーもありません
データベースに接続する際に問題が発生することは間違いありません。私が間違ったパスワードを与えると、私はまだ何の誤りもありません。
スパイダーがすべてのデータをスクラップしたとき、統計情報のダンプを開始するまでに数分かかります。
2017-08-31 13:17:12 [scrapy] INFO: Closing spider (finished)
2017-08-31 13:17:12 [scrapy] INFO: Stored csv feed (27 items) in: test.csv
2017-08-31 13:24:46 [scrapy] INFO: Dumping Scrapy stats:
パイプライン:
import MySQLdb.cursors
from twisted.enterprise import adbapi
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
from scrapy.utils.project import get_project_settings
from scrapy import log
SETTINGS = {}
SETTINGS['DB_HOST'] = 'mysql.domain.com'
SETTINGS['DB_USER'] = 'username'
SETTINGS['DB_PASSWD'] = 'password'
SETTINGS['DB_PORT'] = 3306
SETTINGS['DB_DB'] = 'database_name'
class MySQLPipeline(object):
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.stats)
def __init__(self, stats):
print "init"
#Instantiate DB
self.dbpool = adbapi.ConnectionPool ('MySQLdb',
host=SETTINGS['DB_HOST'],
user=SETTINGS['DB_USER'],
passwd=SETTINGS['DB_PASSWD'],
port=SETTINGS['DB_PORT'],
db=SETTINGS['DB_DB'],
charset='utf8',
use_unicode = True,
cursorclass=MySQLdb.cursors.DictCursor
)
self.stats = stats
dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self, spider):
print "close"
""" Cleanup function, called after crawing has finished to close open
objects.
Close ConnectionPool. """
self.dbpool.close()
def process_item(self, item, spider):
print "process"
query = self.dbpool.runInteraction(self._insert_record, item)
query.addErrback(self._handle_error)
return item
def _insert_record(self, tx, item):
print "insert"
result = tx.execute(
" INSERT INTO matches(type,home,away,home_score,away_score) VALUES (soccer,"+item["home"]+","+item["away"]+","+item["score"].explode("-")[0]+","+item["score"].explode("-")[1]+")"
)
if result > 0:
self.stats.inc_value('database/items_added')
def _handle_error(self, e):
print "error"
log.err(e)
スパイダー:
import scrapy
import dateparser
from crawling.items import KNVBItem
class KNVBspider(scrapy.Spider):
name = "knvb"
start_urls = [
'http://www.knvb.nl/competities/eredivisie/uitslagen',
]
custom_settings = {
'ITEM_PIPELINES': {
'crawling.pipelines.MySQLPipeline': 301,
}
}
def parse(self, response):
# www.knvb.nl/competities/eredivisie/uitslagen
for row in response.xpath('//div[@class="table"]'):
for div in row.xpath('./div[@class="row"]'):
match = KNVBItem()
match['home'] = div.xpath('./div[@class="value home"]/div[@class="team"]/text()').extract_first()
match['away'] = div.xpath('./div[@class="value away"]/div[@class="team"]/text()').extract_first()
match['score'] = div.xpath('./div[@class="value center"]/text()').extract_first()
match['date'] = dateparser.parse(div.xpath('./preceding-sibling::div[@class="header"]/span/span/text()').extract_first(), languages=['nl']).strftime("%d-%m-%Y")
yield match
私はそれが同様に歓迎されるだろう達成しようとしているものを行うことが可能な優れたパイプラインが存在する場合。ありがとう!
アップデート:私は最終的に働いて、この関数になった(したがって、私の問題を解決しました)受け入れ答えにあるリンクを使用して、 :
def process_item(self, item, spider):
print "process"
query = self.dbpool.runInteraction(self._insert_record, item)
query.addErrback(self._handle_error)
query.addBoth(lambda _: item)
return query
あなたのインデントが間違っているようです。 '_insert_error'と' _handle_error'はパイプラインの一部ではありません。あなたのパイプラインの 'process_item'が呼び出されているかどうかチェックしましたか? –
コードをいくつかの印刷と固定インデントで更新しました。 'process_item'と' _insert_record'と '_handle_error'を除く他のすべての関数が呼び出されます。私は実際には 'init'関数の接続が間違ったパスワードで失敗するのに対し、これまでには驚いていますが、何らかの理由でこれに対してエラーが出ません。 – Casper
@Casper MySQLサーバーのログにアクセスできますか?もしそうなら、それをチェックしてみてください。何かを見つけるかもしれません。 –