如何以编程方式设置和启动Scrapy spider(网址和设置)

arn*_*rno 25 python scrapy scrapyd

我已经使用scrapy编写了一个正在运行的爬虫,
现在我想通过Django webapp来控制它,也就是说:

  • 设置1或几个 start_urls
  • 设置1或几个 allowed_domains
  • 设定settings
  • 启动蜘蛛
  • 停止/暂停/恢复蜘蛛
  • 运行时检索一些统计数据
  • 在蜘蛛完成后检索一些统计数据.

起初我认为scrapyd为此而制作的,但在阅读了文档之后,似乎它更像是一个能够管理"打包蜘蛛"的守护进程,也就是"scrapy eggs"; 并且所有的设置(start_urls,allowed_domains,settings)仍必须在"scrapy鸡蛋"本身硬编码; 所以它看起来不像我的问题的解决方案,除非我错过了什么.

我还看了这个问题:如何为scrapy提供URL以进行爬行?; 但提供多个网址的最佳答案是由作者himeslf认定为"丑陋的黑客",涉及一些python子进程和复杂的shell处理,所以我认为这里找不到解决方案.此外,它可能适用start_urls,但它似乎不允许allowed_domainssettings.

然后我看了scrapy webservices:它似乎是检索统计数据的好方法.但是,它仍然需要一个正在运行的蜘蛛,并且没有改变的线索settings

关于这个问题有几个问题,似乎没有一个问题令人满意:

我知道scrapy用于生产环境; 像scrapyd这样的工具表明,确实有一些方法可以满足这些要求(我无法想象用于处理的scrapy egg scrap是手工生成的!)

非常感谢你的帮助.

小智 9

起初我认为scrapyd是为此而制作的,但在阅读了文档之后,似乎它更像是一个能够管理"打包蜘蛛"的守护进程,也就是"scrapy eggs"; 并且所有设置(start_urls,allowed_domains,settings)仍然必须在'scrapy egg'本身中进行硬编码; 所以它看起来不像我的问题的解决方案,除非我错过了什么.

我不同意上面的声明,start_urls不需要硬编码它们可以动态传递给类,你应该能够将它作为参数传递给你

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1
Run Code Online (Sandbox Code Playgroud)

或者您应该能够从数据库或文件中检索URL.我从这样的数据库中得到它

class WikipediaSpider(BaseSpider):
    name = 'wikipedia'
    allowed_domains = ['wikipedia.com']
    start_urls = []

    def __init__(self, name=None, url=None, **kwargs):
        item = MovieItem()
        item['spider'] = self.name
        # You can pass a specific url to retrieve 
        if url:
            if name is not None:
                self.name = name
            elif not getattr(self, 'name', None):
                raise ValueError("%s must have a name" % type(self).__name__)
            self.__dict__.update(kwargs)
            self.start_urls = [url]
        else:
            # If there is no specific URL get it from Database
            wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB -->
            if wikiliks == None:
                print "**************************************"
                print "No Links to Query"
                print "**************************************"
                return None

            for link in wikiliks:
                # SOME PROCESSING ON THE LINK GOES HERE
                self.start_urls.append(urllib.unquote_plus(link[0]))

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        # Remaining parse code goes here
Run Code Online (Sandbox Code Playgroud)


Ami*_*ber 8

要以编程方式更改设置并在应用程序中运行刮刀,这是我得到的:

from scrapy.crawler import CrawlerProcess
from myproject.spiders import MySpider
from scrapy.utils.project import get_project_settings

os.environ['SCRAPY_SETTINGS_MODULE'] = 'myproject.my_settings_module'
scrapy_settings = get_project_settings()
scrapy_settings.set('CUSTOM_PARAM', custom_vaule)
scrapy_settings.set('ITEM_PIPELINES', {})  # don't write jsons or anything like that
scrapy_settings.set('DOWNLOADER_MIDDLEWARES', {
   'myproject.middlewares.SomeMiddleware': 100,
})
process = CrawlerProcess(scrapy_settings)
process.crawl(MySpider, start_urls=start_urls)
process.start()
Run Code Online (Sandbox Code Playgroud)


Ran*_*ngh 0

我认为你需要看看这个

http://django-dynamic-scraper.readthedocs.org/en/latest/

这有点类似于你想要的。它还使用了任务调度的celery。你可以看代码看看他在做什么。我认为如果你修改他的代码来做你想做的事情会很容易

它还有关于如何使用 django 设置界面的良好文档