arn*_*rno 25 python scrapy scrapyd
我已经使用scrapy编写了一个正在运行的爬虫,
现在我想通过Django webapp来控制它,也就是说:
start_urlsallowed_domainssettings值起初我认为scrapyd是为此而制作的,但在阅读了文档之后,似乎它更像是一个能够管理"打包蜘蛛"的守护进程,也就是"scrapy eggs"; 并且所有的设置(start_urls,allowed_domains,settings)仍必须在"scrapy鸡蛋"本身硬编码; 所以它看起来不像我的问题的解决方案,除非我错过了什么.
我还看了这个问题:如何为scrapy提供URL以进行爬行?; 但提供多个网址的最佳答案是由作者himeslf认定为"丑陋的黑客",涉及一些python子进程和复杂的shell处理,所以我认为这里找不到解决方案.此外,它可能适用start_urls,但它似乎不允许allowed_domains或settings.
然后我看了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)
要以编程方式更改设置并在应用程序中运行刮刀,这是我得到的:
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)
我认为你需要看看这个
http://django-dynamic-scraper.readthedocs.org/en/latest/
这有点类似于你想要的。它还使用了任务调度的celery。你可以看代码看看他在做什么。我认为如果你修改他的代码来做你想做的事情会很容易
它还有关于如何使用 django 设置界面的良好文档
| 归档时间: |
|
| 查看次数: |
6167 次 |
| 最近记录: |