我想从脚本而不是scrapy crawl
命令运行我的爬虫。
我找到了这个页面:
http://doc.scrapy.org/en/latest/topics/practices.html
但它并没有说要把脚本放在哪里。
请帮忙解答,谢谢!
我想从脚本而不是scrapy crawl
命令运行我的爬虫。
我找到了这个页面:
http://doc.scrapy.org/en/latest/topics/practices.html
但它并没有说要把脚本放在哪里。
请帮忙解答,谢谢!
很简单明了 :)
只需查看 官方文档。我会做一点更改,这样您就可以控制蜘蛛仅在执行 python myscript.py
时才运行,而不是每次从脚本中导入时都运行。只需添加一个 if __name__ == "__main__"
:
import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
# Your spider definition
pass
if __name__ == "__main__":
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
现在将文件保存为myscript.py
,并运行`python myscript.py`。
享受吧!
settings = {"FEED_FORMAT": "json", "FEED_URI": "/tmp/verizon.json"} crawler_process = CrawlerProcess(settings=settings)
。 - learnToCode为什么不直接这样做呢?
from scrapy import cmdline
cmdline.execute("scrapy crawl myspider".split())
scrapy.cfg
相同的路径下。幸运的是,Scrapy源代码是开放的,所以您可以按照抓取命令的方式进行操作,并在您的代码中执行相同的操作:
...
crawler = self.crawler_process.create_crawler()
spider = crawler.spiders.create(spname, **opts.spargs)
crawler.crawl(spider)
self.crawler_process.start()
**opts.spargs
是什么? - Yuda Prawirarunspider
,这使得你可以在不必创建项目的情况下运行爬虫。stackoverflow_spider.py
的单个文件,并添加如下内容:import scrapy
class QuestionItem(scrapy.item.Item):
idx = scrapy.item.Field()
title = scrapy.item.Field()
class StackoverflowSpider(scrapy.spider.Spider):
name = 'SO'
start_urls = ['http://stackoverflow.com']
def parse(self, response):
sel = scrapy.selector.Selector(response)
questions = sel.css('#question-mini-list .question-summary')
for i, elem in enumerate(questions):
l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
l.add_value('idx', i)
l.add_xpath('title', ".//h3/a/text()")
yield l.load_item()
假设您已经正确安装了Scrapy,您可以使用以下命令运行它:
scrapy runspider stackoverflow_spider.py -t json -o questions-items.json
l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
上遇到了错误:exceptions.AttributeError: 'module' object has no attribute 'loader'
。你有什么解决办法吗? - Basjscrapy.contrib.loader
才能使其工作。 - Elias Dornelespython stackoverflow_spider.py
运行它,而不是使用scrapy runspider ...
?我真的被这个小问题卡住了。 - Basj
xxx.com
,如果所有蜘蛛的名称都相同但在不同的项目中,哪一个会被触发?我实际上有这种情况。 - Marco Dinatsoli