如何在完成后重新启动同一个蜘蛛,以便它可以获取要处理的下一个URL列表。由于我的数据库太大,我无法立即通过所有网站。所以我需要蜘蛛应该循环运行,以获取100个网站处理它,然后再次获取100个网站,等等。一旦完成处理100个网站,有没有办法打电话给蜘蛛?因为我是scrapy的新手,请帮我解决这个问题。或者有没有选择安排蜘蛛在指定的时间间隔后运行?
在当前代码中,我可以从域中获取URL并将其存储在数据库中。但我需要一直运行蜘蛛。有没有办法运行一次,它将继续运行,直到没有网站要处理。请帮忙。
class MyItem(Item):
url = Field()
class MySpider(CrawlSpider):
con = MySQLdb.connect(host="localhost", user="user",
passwd="pwd", db="db")
cur = con.cursor(MySQLdb.cursors.DictCursor)
cur.execute("select website from table limit 100")
name = "first"
urls = []
domains = []
allowed_domains = []
start_urls = []
row = cur.fetchone()
while row is not None:
p = "%s" % (row["website"])
domains.append(p)
start_urls = "http://www.% s" % p
urls.append(start_urls)
row = cur.fetchone()
allowed_domains = domains
start_urls = urls
cur.close()
con.close()
print(start_urls)
rules = (Rule(SgmlLinkExtractor(), callback='parse_url', follow=True),)
connection = MySQLdb.connect(host="localhost", user="user",
passwd="pwd", db="db")
cursor = connection.cursor(MySQLdb.cursors.DictCursor)
def parse_url(self, response):
item = MyItem()
item['url'] = response.url
topDomain = tldextract.extract(response.url)
tld = topDomain.domain + '.' + topDomain.suffix
add_url = "INSERT INTO crawl_db (url,tld,time) VALUES (%s,%s,%s)"
add_url_data = (item['url'], tld, strftime("%Y-%m-%d %H:%M:%S", gmtime()))
self.cursor.execute(add_url, add_url_data)
self.connection.commit()
谢谢。
答案 0 :(得分:3)
如果将作业传递一个指示其顺序的索引,或者两个指示sql查询的偏移量和限制的值,请检查here to use it。
我假设你可以使用bash脚本来运行每个作业并传递这些参数,以运行带有额外参数check here的scrapy作业。
现在,如果您想在作业完成时运行“某事”,则可以使用Extension
spider_closed
signal。
Check this tutorial了解如何创建自己的扩展程序,并在spider_closed
方法上执行任何操作。请记住activate it。
答案 1 :(得分:0)
我通过创建一个新的python脚本并从代码中调用spider来实现它的工作原理如下:
import os
while True:
os.system("scrapy crawl first")
所以它运行蜘蛛,获取url并处理它。并使用不同的网址再次运行该过程。
稍后,一旦数据库没有任何要处理的URL,我将给出条件结束。
Thnakyou