Scrapy如何以动态(变量)参数递归运行蜘蛛?

时间:2017-04-09 09:47:54

标签: python scrapy web-crawler twisted scrapy-spider

我有一个完整的功能蜘蛛代码,它接受一个参数date。这将在蜘蛛的每次迭代中发生变化。

为了测试purpouse,我创建了一个执行以下操作的shell脚本。

  1. 有一个点文件.date,其格式为YYYY-MM-DD脚本读取文件并将日期传递给蜘蛛。
  2. 一旦任务完成并且数据保存到mysql,日期值减少一天并将其保存在文件中以供下一次迭代。
  3. Shell脚本

    lastDate=$(cat .dailyScrapeDate)
    echo "Last scraped Date : $lastDate"
    nextDate=$(date -d "$lastDate -1 day" "+%Y-%m-%d")
    echo "Next scraped Date : $nextDate"
    
    echo "Launching Spider"
    scrapy crawl dailyDataSpider -a date=$nextDate
    
    echo "Writing scraped date ($nextDate) to dot file .dailyScrapeDate"
    echo "$nextDate" > .dailyScrapeDate
    

    现在我需要将其移至爬虫程序。那我该怎么办?我是否需要创建一个独立的python文件并运行它?例如,我创建了一个文件process.py

    Python脚本process.py

    from DailyDataSpider import DailyDataSpider
    from scrapy.crawler import CrawlerProcess
    
    process = CrawlerProcess()
    process.crawl( DailyDataSpider, date=date ) # TODO: Read and pass date
    process.start()
    # Save date?
    

    参数date = date已经通过,但是我对此后如何前进感到有点困惑。我是否在python文件上读写点文件?这个文件代码是在每次迭代时运行还是废弃只接受一次参数并与之一起运行?

    问题:如何以动态(变量)参数递归运行蜘蛛?

1 个答案:

答案 0 :(得分:2)

这个脚本没问题

from DailyDataSpider import DailyDataSpider
from scrapy.crawler import CrawlerProcess

process = CrawlerProcess()
process.crawl( DailyDataSpider, date=date ) # TODO: Read and pass date
process.start()

现在在您的蜘蛛文件中执行此操作

from scrapy.spiders import CrawlSpider
class DailyDataSpider (CrawlSpider):

      def __init__(self, date=None):
             if date:
                  self.date = date

现在可以在蜘蛛的任何位置访问self.date。 并且您可以访问datepipeline中的middleware spider.date

init ()中提供了默认值,以防止错误,如果我们不想传递日期参数...那么scrapy crawl spider1 -a date=date_herescrapy crawl spider1将起作用