【Spider】使用命令行启动时,能正常抓取,但是在pycharm直接运行不能保存数据

通过cmd 运行命令scrapy crawl 【爬虫名称】可以正常运行,并把数据保存到json文件和下载爬取的图片

但是在项目的spiders目录下的 firstTestSpider.py文件里添加:

 if __name__=='__main__':
#启动爬虫方法一
process=CrawlerProcess({
'USER_AGENT':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
})
process.crawl(FirstTestSpider)
# 如果有多个Spider,可以写多几个
#process.crawl(SecondTestSpider)
process.start()


#启动爬虫方法二
configure_logging()
runner=CrawlerProcess()
runner.crawl(FirstTestSpider)
# 如果有多个Spider,可以写多几个
#runner.crawl(name)
d=runner.join()
d.addBoth(lambda _:reactor.stop())
reactor.run()


#启动爬虫方法三
configure_logging()
runner=CrawlerRunner()
@defer.inlineCallbacks
def crawl():
yield runner.crawl(FirstTestSpider)
# 如果有多个Spider,可以写多几个
#yield runner.crawl(SecondTestSpider)
reactor.stop()
crawl()
reactor.run()

以上三种方式虽然运行后正常结束,不过没有保存json文件,也没有下载图片。(应该是没有跑进pipeline)

所以后来上网搜索之后转用另一种方式,直接在项目下新建run.py文件:#coding=utf-8
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

from spiders.firstTestSpider import FirstTestSpider

settings=get_project_settings()
process=CrawlerProcess({
'USER_AGENT':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
})
process.settings=settings
process.crawl(FirstTestSpider)
process.start()

这里使用的的是前面的第一种启动方式
运行后,可以正常下载爬取的图片,在UseScrapyProject目录下(即run.py同级目录下可以生成paper.json)

然后通过对比run.py和spider.py中if __name__=='__main__'的启动方法一的代码,
发现其实这里漏了一步process.settings=settings所以其实是因为没有获取到settings里的设置,因而没有保存数据。(所以前面猜测是对的,确实没有跑进pipeline模块)
所以把前面代码中添加:
from scrapy.utils.project import get_project_settings
if __name__=='__main__':
settings = get_project_settings()#获取设置
   #启动爬虫方法一
process=CrawlerProcess({
'USER_AGENT':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
})
process.settings = settings #赋值
process.crawl(FirstTestSpider)
# 如果有多个Spider,可以写多几个
#process.crawl(SecondTestSpider)
process.start()
就可以成功保存数据,json文件放在firstTestSpider.py同级目录下。图片也能正常下载

同理方法二改为:
from scrapy.utils.project import get_project_settings
  settings = get_project_settings()
    #启动爬虫方法二
configure_logging()
runner=CrawlerProcess(settings=settings)
    runner.crawl(FirstTestSpider)
# 如果有多个Spider,可以写多几个
#runner.crawl(name)
d=runner.join()
d.addBoth(lambda _:reactor.stop())
reactor.run()
方法三改为:
from scrapy.utils.project import get_project_settings
  
  settings = get_project_settings()
  #启动爬虫方法三
  configure_logging()
  runner=CrawlerRunner(settings=settings)
  @defer.inlineCallbacks
  def crawl():
  yield runner.crawl(FirstTestSpider)
  # 如果有多个Spider,可以写多几个
  #yield runner.crawl(SecondTestSpider)
  reactor.stop()
  crawl()
  reactor.run()



所以说,其实在spider中启动和新建run.py效果都是一样的,就是注意获取一下settings

以上方法都亲测可行,如有不足之处欢迎指正~


猜你喜欢

转载自www.cnblogs.com/HAHACHANGEFROMNOW/p/9365513.html