如何设置和编程推出一个Scrapy蜘蛛(URL和设置)(How to setup and launc

2019-08-01 17:31发布

我已经写了使用scrapy工作履带,
现在我想通过一个Django的web应用来控制它,这就是说:

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

起初我还以为scrapyd为这个做,但阅读文档后,它似乎更能够管理“打包蜘蛛”,又名“scrapy鸡蛋”守护程序; 并且所有的设置( start_urlsallowed_domainssettings ),仍必须在“scrapy鸡蛋”本身硬编码; 所以它看起来并不像一个解决我的问题,除非我错过了什么。

我也看了一下这个问题: 如何让网址scrapy爬行? ; 但是,最好的答案提供多个URL被笔者himeslf为“丑陋的黑客攻击”,涉及一些Python子和复杂的外壳处理合格的,所以我不认为解决办法是在这里找到。 此外,它可以连续工作start_urls ,但它似乎并没有让allowed_domainssettings

然后,我环视了一下, scrapy web服务 :这似乎是检索统计了很好的解决方案。 但是,它仍然需要一个运行的蜘蛛,并没有任何线索更改settings

有关于这一主题的几个问题,他们都不似乎令人满意:

  • 使用一法scrapy蜘蛛换几家网站,这一次似乎已经过时,因为为0.7 scrapy已经发展了很多
  • 创建-A-仿制scrapy蜘蛛没有公认的答案,还在讨论围绕调整外壳参数。

我知道,scrapy在生产环境中使用; 和像scrapyd工具表明,有一些definitvely来处理这些需求的方式(我无法想象的是,scrapy鸡蛋scrapyd是处理都是手工生成的!)

非常感谢你的帮助。

Answer 1:

起初我还以为scrapyd为这个做,但阅读文档后,它似乎更能够管理“打包蜘蛛”,又名“scrapy鸡蛋”守护程序; 并且所有的设置(start_urls,allowed_domains,设置)仍必须在“scrapy鸡蛋”本身硬编码; 所以它看起来并不像一个解决我的问题,除非我错过了什么。

我不同意上述说法,start_urls不必硬编码就可以被动态传递给类,你应该能够把它作为像这样的争论

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

或者,你应该能够从数据库或文件中检索的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


Answer 2:

对于编程方式更改设置和运行从应用程序内的刮板,这里是我的了:

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()


Answer 3:

这其实是很简单的!

from mypackage.spiders import MySpider
from scrapy.crawler import CrawlerProcess

results = []

class MyPipeline(object):
    """ A custom pipeline that stores scrape results in 'results'"""
    def process_item(self, item, spider):
        results.append(dict(item))

process = CrawlerProcess({
    # An example of a custom setting
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',  
    'ITEM_PIPELINES': {'__main__.MyPipeline': 1},   # Hooking in our custom pipline above
})

start_urls=[
    'http://example.com/page1', 
    'http://example.com/page2',
]
process.crawl(MySpider, start_urls=start_urls)
process.start() # the script will block here until the crawling is finished

# Do something with the results
print results


Answer 4:

我认为你需要看看这个

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

这确实有点类似于你想要什么。 它还使用任务SHEDULING的芹菜。 你可以看到代码,看看他在做什么。 我认为这将是容易,如果你修改了代码,做你想做的

它也有如何设置使用Django良好的界面文档



文章来源: How to setup and launch a Scrapy spider programmatically (urls and settings)