質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

Scrapyのpipeline.py内でMySQLdbを使用した際のAttributeError

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,146

konataro

score 37

 サイトから記事をクローリング、スクレイピングしてMySQLに格納

ScrapyでクローリングしてMySQLに格納するためにMySQLdbを使用したのですが、AttributeErrorがでてしまいます。。SpiderのソースコードとSetting.pyは以下です。

from scrapy.spiders import SitemapSpider


class WiredjpSpider(SitemapSpider):
    name = "wiredjp"
    allowed_domains = ["wired.jp"]
    sitemap_urls = [
        'https://wired.jp/sitemap.xml',
    ]

    sitemap_follow = [
        r'post-2015-',
    ]

    sitemap_rules = [
        (r'/2015/\d\d/\d\d/', 'parse_post'),
    ]

    def parse_post(self, response):
        yield{
            'title': response.css('h1.post-title::text').extract_first(),
        }
# -*- coding: utf-8 -*-

# Scrapy settings for myproject project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://doc.scrapy.org/en/latest/topics/settings.html
#     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://doc.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'myproject'

SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'

ROBOTSTXT_OBEY = True

DOWNLOAD_DELAY = 1

ITEM_PIPELINES = {
    'myproject.pipelines.ValidationPipeline': 300,
    'myproject.pipelines.MySQLPipeline': 800,
}

 発生している問題・エラーメッセージ

(menv_scrapy) □□□□@home:/mnt/c/Users/□□□□/python.crawling&scraping/myproject$ scrapy crawl wiredjp
2018-10-21 05:29:15 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: myproject)
2018-10-21 05:29:15 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.0, w3lib 1.19.0, Twisted 18.7.0, Python 3.7.0 (default, Oct  9 2018, 10:31:47) - [GCC 7.3.0], pyOpenSSL 18.0.0 (OpenSSL 1.0.2p  14 Aug 201
8), cryptography 2.3.1, Platform Linux-4.4.0-17134-Microsoft-x86_64-with-debian-buster-sid
2018-10-21 05:29:15 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'myproject', 'DOWNLOAD_DELAY': 1, 'FEED_EXPORT_ENCODING': 'utf-8', 'NEWSPIDER_MODULE': 'myproject.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['myproject.spiders']}

2018-10-21 05:29:15 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.memusage.MemoryUsage',
 'scrapy.extensions.logstats.LogStats']
2018-10-21 05:29:15 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2018-10-21 05:29:15 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2018-10-21 05:29:15 [scrapy.middleware] INFO: Enabled item pipelines:
['myproject.pipelines.ValidationPipeline', 'myproject.pipelines.MySQLPipeline']
2018-10-21 05:29:15 [scrapy.core.engine] INFO: Spider opened
2018-10-21 05:29:15 [scrapy.core.engine] INFO: Closing spider (shutdown)


ここから↓エラー


2018-10-21 05:29:15 [scrapy.core.engine] ERROR: Scraper close failure
Traceback (most recent call last):
  File "/home/□□□□/.conda/envs/menv_scrapy/lib/python3.7/site-packages/scrapy/crawler.py", line 82, in crawl
    yield self.engine.open_spider(self.spider, start_requests)
AttributeError: 'WiredjpSpider' object has no attribute 'setting'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/□□□□/.conda/envs/menv_scrapy/lib/python3.7/site-packages/twisted/internet/defer.py", line 654, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/mnt/c/Users/□□□□/python.crawling&scraping/myproject/myproject/pipelines.py", line 43, in close_spider
    self.conn.close()
AttributeError: 'MySQLPipeline' object has no attribute 'conn'
2018-10-21 05:29:15 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'finish_reason': 'shutdown',
 'finish_time': datetime.datetime(2018, 10, 20, 20, 29, 15, 747971),
 'log_count/ERROR': 1,
 'log_count/INFO': 6}
2018-10-21 05:29:15 [scrapy.core.engine] INFO: Spider closed (shutdown)
Unhandled error in Deferred:
2018-10-21 05:29:15 [twisted] CRITICAL: Unhandled error in Deferred:

2018-10-21 05:29:15 [twisted] CRITICAL:
Traceback (most recent call last):
  File "/home/□□□□/.conda/envs/menv_scrapy/lib/python3.7/site-packages/twisted/internet/defer.py", line 1418, in _inlineCallbacks
    result = g.send(result)
  File "/home/□□□□/.conda/envs/menv_scrapy/lib/python3.7/site-packages/scrapy/crawler.py", line 82, in crawl
    yield self.engine.open_spider(self.spider, start_requests)
AttributeError: 'WiredjpSpider' object has no attribute 'setting'

 pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.exceptions import DropItem
import MySQLdb


class MyprojectPipeline(object):
    def process_item(self, item, spider):
        return item


class MySQLPipeline(object):

    def open_spider(self, spider):

        setting = spider.setting
        params = {
            'host': setting.get('MYSQL_HOST', 'localhost'),
            'db': setting.get('MYSQL_DATABASE', 'scraping'),
            'user': setting.get('MYSQL_USER', ''),
            'passwd': setting.get('MYSQL_PASSWORD', ''),
            'charset': setting.get('MYSQL_CHARSET', 'utf8mb4'),
        }

        self.conn = MySQLdb.connect(**params)
        self.c = self.conn.cursor()
        self.c.execute('''
        create table if no exists items (
        id integer not null auto_increment,
        title char(200) not null,
        primary key (id)
        )
        ''')

        self.conn.commit()

    def close_spider(self, spider):

        self.conn.close()

    def process_item(self, item, spider):

        self.c.execute('insert into items (title) values (%(title)s)', dict(item))
        self.conn.commit()
        return item



class ValidationPipeline(object):

    def process_item(self, item, spider):
        if not item['title']:
            raise DropItem('Missing title')

        return item

 環境

windows10
WSL:Ubuntu 18.04.1 LTS

Anaconda3-5.3.0
Python3.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決いたしました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る