使用scrapy爬行bbs时扭曲失败

时间:2015-03-28 03:29:51

标签: python web-scraping scrapy scrapy-spider twist

我是python scrapy的新手,写了一个简单的脚本来抓取我学校bbs的帖子。但是,当我的蜘蛛运行时,它会收到如下错误消息:

  

015-03-28 11:16:52 + 0800 [nju_spider] DEBUG:正在重试http://bbs.nju.edu.cn/bbstcon?board=WarAndPeace&file=M.1427299332.A> (失败2次):[>]   2015-03-28 11:16:52 + 0800 [nju_spider] DEBUG:重试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]信息:倾销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 / filtered':25,        'finish_reason':'完成',        '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]信息:蜘蛛关闭(已完成)

似乎蜘蛛尝试了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 个答案:

答案 0 :(得分:2)

首先,请确保您没有通过网络抓取方法违反网站的使用条款。 Be a good web-scraping citizen

接下来,您可以将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'
}

或者,您可以使用中间件旋转用户代理。以下是我基于fake-useragent包实施的内容:


另一个可能的问题可能是您经常访问网站,考虑调整DOWNLOAD_DELAY setting

  

下载者之前应该等待的时间(以秒为单位)   从同一网站下载连续页面。这可以使用   限制爬行速度以避免过于严重地击中服务器。

还有另一个可以产生积极影响的相关设置:CONCURRENT_REQUESTS

  

将会发生的最大并发(即同时)请求数   由Scrapy下载程序执行。