首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式设置和启动Scrapy蜘蛛(urls和设置)

问如何以编程方式设置和启动Scrapy蜘蛛(urls和设置)
EN

Stack Overflow用户
提问于 2012-10-21 10:10:19
回答 4查看 7.4K关注 0票数 25

我用刮痕写了一个工作的爬虫,

现在我想通过Django say应用程序来控制它,也就是说:

  • 集合1或多个start_urls
  • 集合1或多个allowed_domains
  • 设置settings值
  • 启动蜘蛛
  • 停止/暂停/恢复蜘蛛
  • 运行时检索一些统计数据
  • 在蜘蛛完成后再检索一些数据。

起初,我认为[医]刮伤是为此而设计的,但在阅读了文档之后,它似乎更像是一个守护进程,能够管理“打包蜘蛛”,也就是“刮擦蛋”;所有设置(start_urls、allowed_domains、settings )必须仍然是硬编码在“刮痕蛋”中;因此,除非我遗漏了什么,否则它看起来并不是解决问题的方法。

我还研究了这个问题:如何给抓取URL抓取抓取?;但是提供多个urls的最佳答案是作者himeslf将其限定为“丑陋的黑客”,涉及到一些python子进程和复杂的shell处理,所以我认为这里找不到解决方案。而且,它可能适用于start_urls,但它似乎不允许allowed_domains或settings。

然后我看了一下刮刮式网络服务:它似乎是检索统计数据的好解决方案。但是,它仍然需要运行中的蜘蛛,并且不知道如何更改settings。

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

我知道scrapy是在生产环境中使用的;像scrapyd这样的工具显示,确实有一些方法来处理这些需求(我无法想象刮痕蛋scrapyd处理的是手工生成的!)

非常感谢你的帮助。

EN

回答 4

Stack Overflow用户

发布于 2013-06-15 03:47:20

一开始我以为剪贴是用来做这个的,但是在阅读了文档之后,它似乎更像是一个守护进程,可以管理‘打包蜘蛛’,也就是‘刮擦蛋’;所有设置(start_urls、allowed_domains、设置)都必须硬编码在‘刮痕蛋’中;所以它看起来不像是我问题的解决方案,除非我遗漏了什么。

我不同意上面的说法,start_urls不需要硬编码,它们可以动态地传递给类,您应该能够将它作为这样的参数传递。

代码语言:javascript
复制
http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

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

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2016-02-04 21:22:38

为了以编程方式更改设置并在应用程序中运行刮刀器,我得到了以下内容:

代码语言:javascript
复制
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()
票数 8
EN

Stack Overflow用户

发布于 2015-09-23 23:25:13

这其实很简单!

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12996910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档