我用 scrapy 写了一个工作爬虫,
现在我想通过Django webapp来控制它,也就是说:
- 设置1个或多个
start_urls
- 设置1个或多个
allowed_domains
- Set
settings
values
- 启动蜘蛛
- 停止/暂停/恢复蜘蛛
- 运行时检索一些统计数据
- 蜘蛛完成后检索一些统计数据。
起初我以为scrapyd https://scrapy.readthedocs.org/en/latest/topics/scrapyd.html是为此而设计的,但在阅读文档后,它似乎更像是一个能够管理“打包蜘蛛”(又名“碎蛋”)的守护进程;并且所有设置(start_urls
, allowed_domains
, settings
)仍然必须硬编码在“scrapy Egg”本身中;所以它看起来不像是我的问题的解决方案,除非我错过了一些东西。
我也看了这个问题:如何给scrapy提供URL进行爬取? https://stackoverflow.com/questions/9681114/how-to-give-url-to-scrapy-for-crawling/12749782#12749782;
但提供多个 url 的最佳答案被作者 Himeslf 称为“丑陋的黑客”,涉及一些 python 子进程和复杂的 shell 处理,所以我认为在这里找不到解决方案。另外,它可能适用于start_urls
,但似乎不允许allowed_domains
or settings
.
然后我看了看scrapy网络服务 https://scrapy.readthedocs.org/en/latest/topics/webservice.html?highlight=webservices#topics-webservice-crawler:
这似乎是检索统计数据的好解决方案。然而,它仍然需要一个正在运行的蜘蛛,并且没有任何改变的线索settings
关于这个主题有几个问题,但没有一个问题令人满意:
-
使用一个 scrapy-spider 处理多个网站 https://stackoverflow.com/questions/2396529/using-one-scrapy-spider-for-several-websites这个似乎已经过时了,因为 scrapy 自 0.7 以来已经发展了很多
-
创建一个通用的 scrapy-spider https://stackoverflow.com/questions/9814827/creating-a-generic-scrapy-spider没有接受的答案,仍在讨论调整 shell 参数。
我知道生产环境使用的是scrapy;像 scrapyd 这样的工具表明,肯定有一些方法可以处理这些要求(我无法想象 scrapyd 正在处理的 scrapy Eggs 是手工生成的!)
非常感谢你的帮助。
起初我以为 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
或者您应该能够从数据库或文件中检索 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)