Я очищаю большой список 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)
До этого момента все работает нормально. Мы ценим любую помощь, которую вы можете мне оказать!