Scrapy застревает, ползая длинный список URL - PullRequest
0 голосов
/ 14 января 2019

Я очищаю большой список URL-адресов (1000 строк), и по истечении заданного времени сканер застревает при сканировании 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)

До этого момента все работает нормально. Мы ценим любую помощь, которую вы можете мне оказать!

1 Ответ

0 голосов
/ 14 января 2019

Причина того, что элемент scrapy syas 0 состоит в том, что он подсчитывает полученные данные, пока вы ничего не даете, а вставляете в свою базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...