gpt4 book ai didi

python - 如何以编程方式设置和启动 Scrapy 蜘蛛(网址和设置)

转载 作者:IT老高 更新时间:2023-10-28 22:22:43 29 4
gpt4 key购买 nike

我已经使用 scrapy 编写了一个工作爬虫,
现在我想通过一个Django webapp来控制它,也就是说:

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

一开始我以为scrapyd是为此而制作的,但在阅读了文档之后,它似乎更像是一个能够管理“打包蜘蛛”的守护进程,又名“抓取鸡蛋”;并且所有设置(start_urlsallowed_domainssettings)仍然必须在“scrapy egg”本身中硬编码;所以它看起来不像是我的问题的解决方案,除非我错过了什么。

我也看过这个问题:How to give URL to scrapy for crawling? ;但是提供多个 url 的最佳答案被作者 himeslf 限定为“丑陋的 hack”,涉及一些 python 子进程和复杂的 shell 处理,所以我认为在这里找不到解决方案。此外,它可能适用于 start_urls,但它似乎不允许 allowed_domainssettings

然后我看了一下scrapy webservices :这似乎是检索统计数据的好方法。但是,它仍然需要一个正在运行的蜘蛛,并且没有更改 settings

的线索

关于这个主题有几个问题,似乎没有一个是令人满意的:

我知道scrapy用于生产环境;而像scrapyd这样的工具表明确实有一些方法可以处理这些要求(我无法想象scrapyd处理的scrapy鸡蛋是手工生成的!)

非常感谢您的帮助。

最佳答案

At first I thought scrapyd was made for this, but after reading the doc, it seems that it's more a daemon able to manage 'packaged spiders', aka 'scrapy eggs'; and that all the settings (start_urls , allowed_domains, settings ) must still be hardcoded in the 'scrapy egg' itself ; so it doesn't look like a solution to my question, unless I missed something.

我不同意上面的说法,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

关于python - 如何以编程方式设置和启动 Scrapy 蜘蛛(网址和设置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996910/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com