Scrapy卡住抓取一长串网址

时间:2019-01-14 15:28:36

标签: python scrapy

我正在抓取大量的url(1000 ish),并且在设置的时间后,搜寻器被困在以0页/分钟的速度爬行。爬行时,问题总是出现在同一位置。网址列表是从MySQL数据库中检索的。我对python和scrapy相当陌生,所以我不知道从哪里开始调试,而且我担心由于我的经验不足,代码本身也有些混乱。任何指出问题所在的指针都会受到赞赏。

我曾经一口气检索整个url列表,而且搜寻器工作正常。但是,我在将结果写回到数据库时遇到了问题,并且我不想将整个url大列表读到内存中,因此我将其更改为一次遍历数据库一次遍历该问题。我可以肯定URL本身不是问题,因为当我尝试从问题URL开始爬网时,它毫无问题地工作,并陷入了另一个但始终如一的位置。

代码的相关部分如下。请注意,该脚本应该作为独立脚本运行,这就是为什么我在Spider本身中定义必要的设置。

class MySpider(CrawlSpider):
    name = "mySpider"
    item = []
    #spider settings
    custom_settings = {
        'CONCURRENT_REQUESTS': 1,
        'DEPTH_LIMIT': 1,
        'DNS_TIMEOUT': 5,
        'DOWNLOAD_TIMEOUT':5,
        'RETRY_ENABLED': False,
        'REDIRECT_MAX_TIMES': 1
    }


    def start_requests(self):

        while i < n_urls:
            urllist = "SELECT url FROM database WHERE id=" + i
            cursor = db.cursor()
            cursor.execute(urllist)
            urls = cursor.fetchall()
            urls = [i[0] for i in urls] #fetch url from inside list of tuples
            urls = str(urls[0]) #transform url into string from list
            yield Request(urls, callback=self.parse, errback=self.errback)

    def errback(self, failure):
        global i
        sql = "UPDATE db SET item = %s, scrape_time = now() WHERE id = %s"
        val = ('Error', str(j))
        cursor.execute(sql, val)
        db.commit()
        i += 1


    def parse(self, response):
        global i
        item = myItem()
        item["result"] = response.xpath("//item to search")
        if item["result"] is None or len(item["result"]) == 0:
            sql = "UPDATE db SET, item = %s, scrape_time = now() WHERE id = %s"
            val = ('None', str(i))
            cursor.execute(sql, val)
            db.commit()
            i += 1
        else:
            sql = "UPDATE db SET item = %s, scrape_time = now() WHERE id = %s"
            val = ('Item', str(i))
            cursor.execute(sql, val)
            db.commit()
            i += 1

刮板卡住,显示以下消息:

2019-01-14 15:10:43 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET someUrl> from <GET anotherUrl>
2019-01-14 15:11:08 [scrapy.extensions.logstats] INFO: Crawled 9 pages (at 9 pages/min), scraped 0 items (at 0 items/min)
2019-01-14 15:12:08 [scrapy.extensions.logstats] INFO: Crawled 9 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-14 15:13:08 [scrapy.extensions.logstats] INFO: Crawled 9 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-14 15:14:08 [scrapy.extensions.logstats] INFO: Crawled 9 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-14 15:15:08 [scrapy.extensions.logstats] INFO: Crawled 9 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-14 15:16:08 [scrapy.extensions.logstats] INFO: Crawled 9 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

到目前为止,一切正常。您能给我的任何帮助都将受到赞赏!

2 个答案:

答案 0 :(得分:1)

scrapy syas 0项的原因是,它计入已产生的数据,而您没有产生任何结果,只是插入数据库。

答案 1 :(得分:0)

我只是遇到了这种情况,所以我想分享导致该错误的原因,以防有人遇到完全相同的问题。

显然,如果您没有为请求指定回调,则默认使用蜘蛛的parse方法作为回调(我的意图是完全不为那些请求提供回调)。

在我的Spider中,我使用了parse方法来执行大多数请求,因此此行为导致了许多不必要的请求,最终导致Scrapy崩溃。 只需为这些请求添加一个空的回调函数(lambda a: None)就解决了我的问题。

相关问题