Scrapy выдает ошибку при запуске crawlerprocess - PullRequest
0 голосов
/ 28 октября 2018

Я написал скрипт на python, используя scrapy для сбора названий различных постов и их ссылок с веб-сайта.Когда я выполняю свой скрипт из командной строки, он работает безупречно.Теперь я собираюсь запустить скрипт, используя CrawlerProcess().Я ищу похожие проблемы в разных местах, но нигде не могу найти прямого решения или чего-нибудь подобного.Однако, когда я пытаюсь запустить его как есть, я получаю следующую ошибку:

из файла stackoverflow.items import StackoverflowItem ModuleNotFoundError: Нет модуля с именем 'stackoverflow'

Thisмой сценарий пока (stackoverflowspider.py):

from scrapy.crawler import CrawlerProcess
from stackoverflow.items import StackoverflowItem
from scrapy import Selector
import scrapy

class stackoverflowspider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['https://stackoverflow.com/questions/tagged/web-scraping']

    def parse(self,response):
        sel = Selector(response)
        items = []
        for link in sel.xpath("//*[@class='question-hyperlink']"):
            item = StackoverflowItem()
            item['name'] = link.xpath('.//text()').extract_first()
            item['url'] = link.xpath('.//@href').extract_first()
            items.append(item)
        return items

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',   
    })
    c.crawl(stackoverflowspider)
    c.start()

items.py включает в себя:

import scrapy

class StackoverflowItem(scrapy.Item):
    name = scrapy.Field()
    url = scrapy.Field()

Это дерево: Нажмите, чтобы увидеть иерархию

Я знаю, что могу добиться успеха таким образом, но мне интересно выполнить задачу только тем способом, который я пробовал выше:

def parse(self,response):
    for link in sel.xpath("//*[@class='question-hyperlink']"):
        name = link.xpath('.//text()').extract_first()
        url = link.xpath('.//@href').extract_first()
        yield {"Name":name,"Link":url}

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Хотя @ Dan-Dev показал мне путь в правильном направлении, я решил предоставить полное решение, которое работало бы для меня безупречно.

Не меняя ничего, кроме того, что я вставляю ниже:

import sys
#The following line (which leads to the folder containing "scrapy.cfg") fixed the problem
sys.path.append(r'C:\Users\WCS\Desktop\stackoverflow')
from scrapy.crawler import CrawlerProcess
from stackoverflow.items import StackoverflowItem
from scrapy import Selector
import scrapy


class stackoverflowspider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['https://stackoverflow.com/questions/tagged/web-scraping']

    def parse(self,response):
        sel = Selector(response)
        items = []
        for link in sel.xpath("//*[@class='question-hyperlink']"):
            item = StackoverflowItem()
            item['name'] = link.xpath('.//text()').extract_first()
            item['url'] = link.xpath('.//@href').extract_first()
            items.append(item)
        return items

if __name__ == "__main__":
    c = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',   
    })
    c.crawl(stackoverflowspider)
    c.start()

Еще раз: включение следующего в скрипт исправило проблему

import sys
#The following line (which leads to the folder containing "scrapy.cfg") fixed the problem
sys.path.append(r'C:\Users\WCS\Desktop\stackoverflow')
0 голосов
/ 28 октября 2018

Это проблема с питоном.Самый простой способ - вызвать его, указав путь к python явно, то есть из каталога, содержащего scrapy.cfg (и, что более важно, модуля stackoverflow), запустить:

PYTHONPATH=. python3 stackoverflow/spiders/stackoverflowspider.py

Это устанавливает путь к python для включения текущего каталога.).

альтернативы см. https://www.daveoncode.com/2017/03/07/how-to-solve-python-modulenotfound-no-module-named-import-error/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...