簡體   English   中英

Scrapy 在抓取一長串 url 時卡住了

[英]Scrapy gets stuck crawling a long list of urls

我正在抓取一個大的 url 列表(1000-ish),並且在設定的時間后,爬蟲卡住了爬行 0 頁/分鍾。 爬行時問題總是出現在同一個地方。 url 列表是從 MySQL 數據庫中檢索的。 我對python和scrapy相當陌生,所以我不知道從哪里開始調試,我擔心由於我的經驗不足,代碼本身也有點混亂。 任何指向問題所在的指針表示贊賞。

我曾經一次檢索整個 url 列表,並且爬蟲工作正常。 但是,我在將結果寫回數據庫時遇到了問題,並且我不想將整個大的 url 列表讀入內存,所以我將其更改為一次一個 url 遍歷數據庫,問題發生在那里。 我相當確定 url 本身不是問題,因為當我嘗試從有問題的 url 開始爬行時,它可以正常工作,在不同但一致的位置進一步卡住。

代碼的相關部分如下。 請注意,該腳本應該作為獨立腳本運行,這就是我在蜘蛛本身中定義必要設置的原因。

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)

到目前為止一切正常。 感謝您能給我的任何幫助!

scrapy syas 0 item 的原因是它計算產生的數據,而您除了插入數據庫之外沒有產生任何東西。

我剛剛發生了這種情況,所以我想分享導致錯誤的原因,以防有人遇到完全相同的問題。

顯然,如果你沒有為請求指定回調,它默認為蜘蛛的 parse 方法作為回調(我的意圖是根本沒有這些請求的回調)。

在我的蜘蛛中,我使用了 parse 方法來制作大部分請求,因此這種行為導致了許多不必要的請求,最終導致 Scrapy 崩潰。 只需為這些請求添加一個空的回調函數( lambda a: None )就解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM