我已经写了使用scrapy工作履带,
现在我想通过一个Django的web应用来控制它,这就是说:
- 设置1个或几个
start_urls
- 设置1个或几个
allowed_domains
- 设置
settings
值 - 启动蜘蛛
- 停止/暂停/恢复蜘蛛
- 检索统计的一些运行时
- retrive一些统计蜘蛛完成后。
起初我还以为scrapyd为这个做,但阅读文档后,它似乎更能够管理“打包蜘蛛”,又名“scrapy鸡蛋”守护程序; 并且所有的设置( start_urls
, allowed_domains
, settings
),仍必须在“scrapy鸡蛋”本身硬编码; 所以它看起来并不像一个解决我的问题,除非我错过了什么。
我也看了一下这个问题: 如何让网址scrapy爬行? ; 但是,最好的答案提供多个URL被笔者himeslf为“丑陋的黑客攻击”,涉及一些Python子和复杂的外壳处理合格的,所以我不认为解决办法是在这里找到。 此外,它可以连续工作start_urls
,但它似乎并没有让allowed_domains
或settings
。
然后,我环视了一下, scrapy web服务 :这似乎是检索统计了很好的解决方案。 但是,它仍然需要一个运行的蜘蛛,并没有任何线索更改settings
有关于这一主题的几个问题,他们都不似乎令人满意:
- 使用一法scrapy蜘蛛换几家网站,这一次似乎已经过时,因为为0.7 scrapy已经发展了很多
- 创建-A-仿制scrapy蜘蛛没有公认的答案,还在讨论围绕调整外壳参数。
我知道,scrapy在生产环境中使用; 和像scrapyd工具表明,有一些definitvely来处理这些需求的方式(我无法想象的是,scrapy鸡蛋scrapyd是处理都是手工生成的!)
非常感谢你的帮助。
起初我还以为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
对于编程方式更改设置和运行从应用程序内的刮板,这里是我的了:
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()
这其实是很简单的!
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
我认为你需要看看这个
http://django-dynamic-scraper.readthedocs.org/en/latest/
这确实有点类似于你想要什么。 它还使用任务SHEDULING的芹菜。 你可以看到代码,看看他在做什么。 我认为这将是容易,如果你修改了代码,做你想做的
它也有如何设置使用Django良好的界面文档
文章来源: How to setup and launch a Scrapy spider programmatically (urls and settings)