使用搜寻器进程运行时,Scrapy引发错误

时间:2018-10-28 16:41:52

标签: python python-3.x web-scraping scrapy scrapy-spider

我用scrapy用python编写了一个脚本,以收集网站上不同帖子的名称及其链接。当我从命令行执行脚本时,它可以正常工作。现在,我的意图是使用CrawlerProcess()运行脚本。我在不同的地方寻找类似的问题,但是在任何地方都找不到任何直接的解决方案或更接近的解决方案。但是,当我尝试按原样运行时,出现以下错误:

  

from stackoverflow.items导入StackoverflowItem   ModuleNotFoundError:没有名为“ stackoverflow”的模块

到目前为止,这是我的脚本(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()

这是树: Click to see the hierarchy

  

我知道我可以通过这种方式来取得成功,但是我只想通过上面的尝试来完成任务:

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 :(得分:1)

尽管@ 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')

答案 1 :(得分:0)

这是python路径问题。 最简单的方法是调用它显式设置python路径,即从包含scrapy.cfg(更重要的是stackoverflow模块)的目录运行:

input.hasNext()

这会将python路径设置为包括当前目录(。)。

有关替代方法,请参见https://www.daveoncode.com/2017/03/07/how-to-solve-python-modulenotfound-no-module-named-import-error/