问题:
在 Django Dynamic Scraper 中,似乎将抓取的对象类的 scraped_obj_attr 类型设置为 STANDARD(UPDATE) 会导致元素被认为是强制性的,如果蜘蛛无法获取该元素的数据,它将丢弃结果。当我将类型更改为 STANDARD 时,蜘蛛在没有获取该元素时不再丢弃结果。这是不可取的,因为如果它们碰巧存在,我希望有更新的可选元素。
检查:
我已经确认数据库包含 dynamic_scraper_scraperelem 表中相应行的“强制”列的“f”。Django admin 中的表也没有显示该元素的 Mandatory 复选标记。我还阅读了有关该主题的所有相关文档和问答主题。关于 DDS/我的 Django 安装的其他一切似乎都运行良好。
我深入研究了代码,并在dynamic_scraper.pipelines、ValidationPipeline 类中找到了它。第 5 行似乎是相关的——也许这个“如果”条件被意外地满足了?
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