对scrapy spider

时间:2016-05-02 11:49:04

标签: web-scraping scrapy

如何在完成后重新启动同一个蜘蛛,以便它可以获取要处理的下一个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()

谢谢。

2 个答案:

答案 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