Я написал скрипт на 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}