1

クロールされたデータをmysqlに挿入するためにscrapyを取得しようとしていますが、コードは正常にクロールされ、バッファ内のデータを収集し、エラーは発生しませんが、データベースは更新されません. 「運がない」、「エラーがない」

パイプライン.py

from twisted.enterprise import adbapi
import datetime
import MySQLdb.cursors

class SQLStorePipeline(object):

    def __init__(self):
        self.dbpool = adbapi.ConnectionPool('MySQLdb', db='craigs',
                user='bra', passwd='boobs', cursorclass=MySQLdb.cursors.DictCursor,
                charset='utf8', use_unicode=True)

    def process_item(self, items, spider):
        # run db query in thread pool
        query = self.dbpool.runInteraction(self._conditional_insert, items)
        query.addErrback(self.handle_error)

        return items

    def _conditional_insert(self, tx, items):
        # create record if doesn't exist.
        # all this block run on it's own thread
        tx.execute("select * from scraped where link = %s", (items['link'][0], ))
        result = tx.fetchone()
        if result:
            log.msg("Item already stored in db: %s" % items, level=log.DEBUG)
        else:
            tx.execute(\
                "insert into scraped (posting_id, email, location, text, title) "
                "values (%s, %s, %s, %s, %s)",
                (items['posting_id'][0],
                items['email'][1],
                items['location'][2],
                items['text'][3],
                items['title'][4],
                )

            )
            log.msg("Item stored in db: %s" % items, level=log.DEBUG)

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

クロール コード

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from craigs.items import CraigsItem

class MySpider(CrawlSpider):
    name = "craigs"
    f = open("urls.txt")
    start_urls = [url.strip() for url in f.readlines()]
    f.close()
    rules = [Rule(SgmlLinkExtractor(restrict_xpaths=('/html/body/blockquote[3]/p/a',)), follow=True, callback='parse_profile')]

    def parse_profile(self, response):
        items = []
        img = CraigsItem()
        hxs = HtmlXPathSelector(response)
        img['title'] = hxs.select('//h2[contains(@class, "postingtitle")]/text()').extract()
        img['posting_id'] = hxs.select('//html/body/article/section/section[2]/div/p/text()').extract()
        items.append(img)
        return items[0]
        return img[0]

設定.py

BOT_NAME = 'craigs' 
BOT_VERSION = '1.0' 
SPIDER_MODULES = ['craigs.spiders'] 
NEWSPIDER_MODULE = 'craigs.spiders' 
USER_AGENT = '%s/%s' % (BOT_NAME, BOT_VERSION)
4

3 に答える 3

1

パイプラインコードがまったく呼び出されない理由は、パイプラインコードがアクティブ化されていないためです。このアクティブ化は、ドキュメントの[アイテムパイプライン]ページに従って、settings.pyに新しいセクションを追加することによって行われます。例えば

ITEM_PIPELINES = [
    'craigs.pipeline.SQLStorePipeline',
]

さらに、parse_profile関数はを返す必要がありますimg。単一の応答ページで複数のアイテムが生成される場合にのみ、アイテムリストを追加して返します。

于 2013-02-10T12:52:04.557 に答える
0

COMMIT変更を永続的にする現在のトランザクションを使用する必要があります。

だから後

tx.execute(\
            "insert into scraped (posting_id, email, location, text, title) "
            "values (%s, %s, %s, %s, %s)",
            (items['posting_id'][0],
            items['email'][1],
            items['location'][2],
            items['text'][3],
            items['title'][4],
            )

        )

必ず

db.commit()

dbここに次のようなものがあります

db = MySQLdb.connect(host="localhost",user = "root", passwd = "1234", db="database_name")

試してみてください。

于 2014-05-24T12:18:18.373 に答える