#python #scrapy
#python #scrapy
Вопрос:
Я запускаю Python.org 64-разрядная версия 2.7 в 64-разрядной версии Windows Vista для использования Scrapy. У меня есть некоторый код, который работает, когда я запускаю его через командную оболочку (за исключением некоторых проблем с командной оболочкой, не распознающей символы, отличные от Юникода), однако, когда я пытаюсь запустить скрипт через Python IDLE, я получаю следующее сообщение об ошибке:
Warning (from warnings module):
File "C:Python27mrscrapmrscrapspiderstest.py", line 24
class MySpider(BaseSpider):
ScrapyDeprecationWarning: __main__.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others)
Код, используемый для генерации этой ошибки, является:
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.utils.markup import remove_tags
import re
class MySpider(BaseSpider):
name = "wiki"
allowed_domains = ["wikipedia.org"]
start_urls = ["http://en.wikipedia.org/wiki/Asia"]
def parse(self, response):
titles = response.selector.xpath("normalize-space(//title)")
for titles in titles:
body = response.xpath("//p").extract()
body2 = "".join(body)
print remove_tags(body2)
Во-первых, в чем причина этой ошибки, когда она нормально работает в командной оболочке? Во-вторых, когда я следую инструкциям в ошибке и заменяю оба экземпляра BaseSpider в коде просто на ‘Spider’, код выполняется в оболочке Python, но ничего не делает. Нет ошибки, ничего не напечатано в журнале, никаких ошибок или предупреждений, ничего.
Кто-нибудь может сказать мне, почему эта исправленная версия кода не выводит свои выходные данные в Python IDLE?
Спасибо
Комментарии:
1. вместо импорта из scrapy.spider BaseSpider выполняет
from scrapy.spider import Spider
2. @Jordan я это уже сделал. когда я делаю это, больше нет ошибок, но просто ничего не делает.
3. это весь ваш код?
4. @PadraicCunningham еще раз здравствуйте. да, это … у меня была более сложная версия этого кода, которую я смог откорректировать благодаря помощи других пользователей. когда я запускаю ее в командной оболочке, я получаю именно тот текстовый вывод, который я хочу. я уже тестировал на bbc sport и wiki. в python IDLE я получаю ошибку с basespider и вообще ничего не использую только spider.
5. итак, только в режиме ожидания у вас возникла проблема? Как вы запускаете ее в режиме ожидания?
Ответ №1:
Добавьте from scrapy.cmdline import execute
в свой импорт
Затем поместите execute(['scrapy','crawl','wiki'])
и запустите свой скрипт.
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.utils.markup import remove_tags
import re
from scrapy.cmdline import execute
class MySpider(Spider):
name = "wiki"
allowed_domains = ["wikipedia.org"]
start_urls = ["http://en.wikipedia.org/wiki/Asia"]
def parse(self, response):
titles = response.selector.xpath("normalize-space(//title)")
for title in titles:
body = response.xpath("//p").extract()
body2 = "".join(body)
print remove_tags(body2)
execute(['scrapy','crawl','wiki'])
Комментарии:
1. вы имеете в виду ввод в оболочку python? это сгенерировало ошибку ‘Traceback (последний вызов last): файл «<pyshell#0>», строка 1, в <module> execute ([‘scrapy’, ‘crawl’, ‘wiki’]) Ошибка имени: имя ‘execute’ не определено’
2. импорт из scrapy.cmdline импорт сначала выполните, добавьте импорт в начало вашего скрипта и команду выполнить внизу, затем нажмите f5
3. хорошо, я добавил import в верхней части скрипта и строку execute прямо внизу, под инструкцией print. код не выдал ошибки, но опять же он просто ничего не сделал.
4. выберите
run module
, вам будет предложено сначала сохранить файл, если вы еще этого не сделали5. … да, это то, что я сделал, запустив Module — F5