Ошибка скручивания при использовании скрапа для сканирования 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.