Оболочка Python не запускает Scrapy

#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