2015-03-28 4 views
1

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

015-03-28 11:16:52+0800 [nju_spider] DEBUG: Retrying http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427299332.A> (failed 2 times): [>] 2015-03-28 11:16:52+0800 [nju_spider] DEBUG: Gave up retrying http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427281812.A> (failed 3 times): [>] 2015-03-28 11:16:52+0800 [nju_spider] ERROR: Error downloading http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427281812.A>: [>]

2015-03-28 11:16:56+0800 [nju_spider] INFO: Dumping Scrapy stats: {'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/filtered': 25, 'finish_reason': 'finished', '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/enqueued': 113, 'scheduler/enqueued/memory': 113, 'start_time': datetime.datetime(2015, 3, 28, 3, 16, 41, 874807)} 2015-03-28 11:16:56+0800 [nju_spider] INFO: Spider closed (finished)

кажется, что паук пытается 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 

ответ

2

Во-первых, убедитесь, что вы не нарушаете Условия веб-сайта использования, принимая веб-соскоб подход. Be a good web-scraping citizen.

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

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' 
} 

или, вы можете вращать агент пользователя с ИМ. Вот один я реализовал на основе fake-useragent пакета:


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

The amount of time (in secs) that the downloader should wait before downloading consecutive pages from the same website. This can be used to throttle the crawling speed to avoid hitting servers too hard.

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

The maximum number of concurrent (ie. simultaneous) requests that will be performed by the Scrapy downloader.

+0

Большое спасибо! Кажется, что веб-сайт, который я хочу писать, запрещает слишком часто получать, поэтому после того, как я установил DOWNLOAD_DELAY на 2, он работает хорошо. – Ron