Scrapy 使用 crawlerprocess 运行时抛出错误
Posted
技术标签:
【中文标题】Scrapy 使用 crawlerprocess 运行时抛出错误【英文标题】:Scrapy throws an error when run using crawlerprocess 【发布时间】:2019-04-01 16:39:02 【问题描述】:我用 python 编写了一个脚本,使用 scrapy 从网站收集不同帖子的名称及其链接。当我从命令行执行我的脚本时,它可以完美运行。现在,我的意图是使用CrawlerProcess()
运行脚本。我在不同的地方寻找类似的问题,但我找不到任何直接的解决方案或任何更接近的解决方案。但是,当我尝试按原样运行它时,出现以下错误:
从 ***.items 导入 ***Item ModuleNotFoundError:没有名为“***”的模块
这是我目前的脚本 (***spider.py
):
from scrapy.crawler import CrawlerProcess
from ***.items import ***Item
from scrapy import Selector
import scrapy
class ***spider(scrapy.Spider):
name = '***'
start_urls = ['https://***.com/questions/tagged/web-scraping']
def parse(self,response):
sel = Selector(response)
items = []
for link in sel.xpath("//*[@class='question-hyperlink']"):
item = ***Item()
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(***spider)
c.start()
items.py
包括:
import scrapy
class ***Item(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
【问题讨论】:
【参考方案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\***')
from scrapy.crawler import CrawlerProcess
from ***.items import ***Item
from scrapy import Selector
import scrapy
class ***spider(scrapy.Spider):
name = '***'
start_urls = ['https://***.com/questions/tagged/web-scraping']
def parse(self,response):
sel = Selector(response)
items = []
for link in sel.xpath("//*[@class='question-hyperlink']"):
item = ***Item()
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(***spider)
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\***')
【讨论】:
【参考方案2】:这是一个python路径问题。 最简单的方法是调用它显式设置 python 路径,即从包含 scrapy.cfg(更重要的是 *** 模块)的目录运行:
PYTHONPATH=. python3 ***/spiders/***spider.py
这会将 python 路径设置为包含当前目录 (.)。
有关替代方案,请参阅https://www.daveoncode.com/2017/03/07/how-to-solve-python-modulenotfound-no-module-named-import-error/
【讨论】:
以上是关于Scrapy 使用 crawlerprocess 运行时抛出错误的主要内容,如果未能解决你的问题,请参考以下文章
爬虫日记(83):Scrapy的CrawlerProcess类
爬虫日记(83):Scrapy的CrawlerProcess类(二)
爬虫日记(83):Scrapy的CrawlerProcess类(三)