我写了一个非常基本的抓取工具,以从stackoverflow的着陆页抓取问题的标题。在过去的几个小时里,我一直在努力使其工作,但每次执行脚本时,我都会遇到相同的错误。完整的追溯如下。
items.py
包括:
import scrapy
class StackoverflowspiderItem(scrapy.Item):
name = scrapy.Field()
infograbber.py
又名蜘蛛包含:
import scrapy
from scrapy import Selector
from scrapy.crawler import CrawlerProcess
from stackoverflowspider.items import StackoverflowspiderItem
class InfograbberSpider(scrapy.Spider):
name = 'infograbber'
allowed_domains = ['stackoverflow.com']
start_urls = ['https://stackoverflow.com/questions/']
def parse(self, response):
sel = Selector(response)
items = []
for question in sel.css(".question-hyperlink"):
title = StackoverflowspiderItem()
title['name'] = question.css("::text").extract_first()
items.append(title)
return items
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
})
c.crawl(InfograbberSpider)
c.start()
这是Project Hierarchy
:
我遇到的错误:
Traceback (most recent call last):
File "C:\Users\WCS\Desktop\stackoverflowspider\stackoverflowspider\spiders\infograbber.py", line 4, in <module>
from stackoverflowspider.items import StackoverflowspiderItem
ModuleNotFoundError: No module named 'stackoverflowspider'
仅供参考:当我尝试如下操作时,它可以工作,但我不希望这样。
import scrapy
from scrapy.crawler import CrawlerProcess
class InfograbberSpider(scrapy.Spider):
name = 'infograbber'
allowed_domains = ['stackoverflow.com']
start_urls = ['https://stackoverflow.com/questions/']
def parse(self, response):
for question in response.css(".question-hyperlink"):
print(question.css("::text").extract_first())
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
})
c.crawl(InfograbberSpider)
c.start()
我要去哪里了?在此先感谢您提供任何解决方案。顺便说一句,我正在使用python 3.6
和scrapy 1.5.0
。我尝试使用cmd
和sublime text editor
执行文件,但是在两种情况下,我都会遇到相同的错误。
答案 0 :(得分:2)
我认为您的问题是您像这样执行spider
:
python infograbber.py
但是您需要进入scrapy.cfg
所在的文件夹,然后像这样运行scrapy:
scrapy crawl infograbber
答案 1 :(得分:1)
如果满足两个条件,就会出现无法找到所需软件包的问题:
发生的事情是,当您将scrapys称为“ Crawlerprocess”时,它找不到要导入的模块。它正在锁定您的“ .settings”模块。它通过查找“ scrapy.cfg”文件来实现。由于您的“ scrapy.cfg”文件位置不正确,因此scrapy不能自动找到它,因此您需要提供帮助:
在您的情况下,“ stackoweflowspider.stackoverflowspider”的文件夹应位于sys.path中。 (sys.path.append()也包含该路径的目录)。如果找到了“ scrapy.cfg”文件,则可以通过scrapys的“ get_project_settings()”函数完成。
您还需要告诉scrapy哪个模块确实是“ .settings”模块。为此,您可以设置一个名为“ SCRAPY_SETTINGS_MODULE”的环境变量。使用
进行设置DispatchQueue.main.async
如果之后您以get_project_settings()作为参数调用CrawlerProcess
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', "stackoweflowspider.stackoverflowspider.settings")
然后它将起作用。要设置您的用户代理信息,您需要再执行一步,但我在这里着重解决了找不到您的软件包和模块的问题。
答案 2 :(得分:1)
下面的代码解决了我的问题:
from ..items import StackoverflowspiderItem