問題:
Django Dynamic Scraper では、スクレイピングされたオブジェクト クラスの scraped_obj_attr タイプを STANDARD(UPDATE) に設定すると、要素が必須と見なされ、その要素のデータを取得できない場合、スパイダーは結果を破棄するようです。タイプを STANDARD に変更すると、スパイダーはその要素を取得しないときに結果をドロップしなくなりました。たまたま存在する場合に更新されるオプションの要素が必要なため、これは望ましくありません。
チェック済み:
データベースには、dynamic_scraper_scraperelem テーブルの対応する行の「Mandatory」列に「f」が含まれていることを確認しました。Django admin の表には、その要素の必須のチェックマークも表示されません。また、このトピックについて見つけたすべての関連ドキュメントと Q&A スレッドも読みました。DDS/私の Django インストールに関する他のすべてはうまく機能しているようです。
コードを少し掘り下げたところ、これは dynamic_scraper.pipelines の ValidationPipeline クラスで見つかりました。行 5 は関連しているようです。おそらく、この「if」条件が予期せず満たされているのでしょうか?
class ValidationPipeline(object):
def process_item(self, item, spider):
url_elem = spider.scraper.get_detail_page_url_elem()
url_name = url_elem.scraped_obj_attr.name
if url_name in item and item[url_name][0:6] == 'DOUBLE':
mandatory_elems = spider.scraper.get_standard_update_elems()
else:
mandatory_elems = spider.scraper.get_mandatory_scrape_elems()
for elem in mandatory_elems:
if not elem.scraped_obj_attr.name in item or\
(elem.scraped_obj_attr.name in item and not item[elem.scraped_obj_attr.name]):
spider.log("Mandatory elem " + elem.scraped_obj_attr.name + " missing!", log.ERROR)
raise DropItem()
...
質問:
これは予想される動作ですか?
構成:
Ubuntu 12.04.1 32 ビット、Python 2.7.3、Postgresql 9.1、および Supervisor 用のシステム パッケージ。Nginx は PPA の最新の安定版です。スパイダーはテストのために手動で実行されています: "scrapy crawl my_spider -a id=1 -a do_action=yes".
my_scraper.scraper.settings.py:
import sys
import os.path
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
sys.path = sys.path + [os.path.join(PROJECT_ROOT, '../../..'), os.path.join(PROJECT_ROOT, '../..')]
from django.core.management import setup_environ
import mysite.settings
setup_environ(mysite.settings)
BOT_NAME = 'mybot'
BOT_VERSION = '1.0'
SPIDER_MODULES = ['dynamic_scraper.spiders', 'my_scraper.scraper',]
USER_AGENT = '%s/%s' % (BOT_NAME, BOT_VERSION)
ITEM_PIPELINES = [
'dynamic_scraper.pipelines.DjangoImagesPipeline',
'dynamic_scraper.pipelines.ValidationPipeline',
'my_scraper.scraper.pipelines.DjangoWriterPipeline',
]
IMAGES_STORE = os.path.join(PROJECT_ROOT, '../thumbnails')
DSCRAPER_LOG_ENABLED = True
DSCRAPER_LOG_LEVEL = 'INFO'
DSCRAPER_LOG_LIMIT = 5
DOWNLOAD_DELAY = 2
CONCURRENT_SPIDERS = 1
仮想環境:
$ pip freeze
Django==1.4.3
Fabric==1.5.1
PIL==1.1.7
Pillow==1.7.8
Scrapy==0.14.4
South==0.7.6
Twisted==12.3.0
amqp==1.0.6
amqplib==1.0.2
anyjson==0.3.3
argparse==1.2.1
billiard==2.7.3.19
celery==2.5.3
django-appconf==0.5
django-celery==2.5.5
django-dynamic-scraper==0.2.3
django-forms-bootstrap==2.0.3.post1
django-kombu==0.9.4
django-picklefield==0.3.0
django-user-accounts==1.0b7
gevent==0.13.8
greenlet==0.4.0
gunicorn==0.17.1
httplib2==0.7.7
kombu==2.1.8
lxml==3.1beta1
metron==1.0
numpy==1.6.2
oauth2==1.5.211
paramiko==1.9.0
pinax-theme-bootstrap==2.2.2
pinax-theme-bootstrap-account==1.0b2
pinax-utils==1.0b1.dev3
psycopg2==2.4.6
pyOpenSSL==0.13
pycrypto==2.6
python-dateutil==1.5
pytz==2012d
six==1.2.0
w3lib==1.2
wsgiref==0.1.2
zope.interface==4.0.3