Ошибка скручивания при использовании скрапа для сканирования bbs

Я новичок в Python Scrapy и написал простой скрипт для сканирования постов из школьных bbs. Однако, когда мой паук запускается, он получает сообщения об ошибках, подобные этому:

015-03-28 11: 16: 52 + 0800 [nju_spider] ОТЛАДКА: повторная попытка http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427299332.A> (ошибка 2 раза): [> ] 2015-03-28 11: 16: 52 + 0800 [nju_spider] ОТЛАДКА: повторная попытка запускается http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427281812.A> (не удалось 3 раза): [>] 2015-03-28 11: 16: 52 + 0800 [nju_spider] ОШИБКА: Ошибка загрузки http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427281812.A>: [> ]

2015-03-28 11: 16: 56 + 0800 [nju_spider] ИНФОРМАЦИЯ: Статистика Dumping Scrapy: {'downloader / exception_count': 99, 'downloader / exception_type_count / twisted.web._newclient.ResponseFailed': 99, 'downloader / request_bytes ': 36236,' downloader / request_count ': 113,' downloader / request_method_count / GET ': 113,' downloader / response_bytes ': 31135,' downloader / response_count ': 14,' downloader / response_status_count / 200 ': 14,' dupefilter / отфильтровано ': 25,' finish_reason ':' finish ',' finish_time ': datetime.datetime (2015, 3, 28, 3, 16, 56, 677065),' item_scraped_count ': 11,' log_count / DEBUG ': 127, 'log_count / ERROR': 32, 'log_count / INFO': 8, 'request_depth_max': 3, 'response_received_count': 14, 'scheduler/dequeued': 113, 'scheduler/dequeued/memory': 113, 'scheduler/ ставить в очередь ': 113,' планировщик / в очередь / память ': 113, 'start_time': datetime.datetime(2015, 3, 28, 3, 16, 41, 874807)} 2015-03-28 11:16:56+0800 [nju_spider] ИНФОРМАЦИЯ: Паук закрыт (закончено)

Кажется, что паук пытается URL-адрес, но не удается, но этот URL действительно существует. И в bbs есть около тысячи сообщений, но каждый раз, когда я запускаю своего паука, он может получить только несколько случайных сообщений. Мой код похож на следующий и очень благодарен за вашу помощь

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor

from ScrapyTest.items import NjuPostItem


class NjuSpider(CrawlSpider):
    name = 'nju_spider'
    allowed_domains = ['bbs.nju.edu.cn']
    start_urls = ['http://bbs.nju.edu.cn/bbstdoc?board=WarAndPeace']
    rules = [Rule(LinkExtractor(allow=['bbstcon\?board=WarAndPeace&file=M\.\d+\.A']),
              callback='parse_post'),
             Rule(LinkExtractor(allow=['bbstdoc\?board=WarAndPeace&start=\d+']),
              follow=True)]

    def parse_post(self, response):
        # self.log('A response from %s just arrived!' % response.url)
        post = NjuPostItem()
        post['url'] = response.url
        post['title'] = 'to_do'
        post['content'] = 'to_do'
        return post

1 ответ

Решение

Во-первых, убедитесь, что вы не нарушаете Условия использования веб-сайта. Будьте хорошим гражданином.

Далее вы можете установить User-Agent заголовок, чтобы притвориться браузером. Либо предоставить User-Agent в DEFAULT_REQUEST_HEADERS установка:

DEFAULT_REQUEST_HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.104 Safari/537.36'
}

или вы можете вращать User Agent с помощью промежуточного программного обеспечения. Вот тот, который я реализовал на основе fake-useragent пакет:


Другой возможной проблемой может быть то, что вы слишком часто заходите на сайт, подумайте о настройке DOWNLOAD_DELAY настройка:

Время (в секундах), в течение которого загрузчик должен ждать загрузки последовательных страниц с одного и того же веб-сайта. Это можно использовать для ограничения скорости сканирования, чтобы избежать слишком сильного удара по серверам.

Существует еще один важный параметр, который может оказать положительное влияние: CONCURRENT_REQUESTS:

Максимальное количество одновременных (т. Е. Одновременных) запросов, которые будут выполняться загрузчиком Scrapy.

Другие вопросы по тегам