1

我是 python 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>(失败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': '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] 信息:蜘蛛关闭(完成)

似乎蜘蛛尝试了 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
4

1 回答 1

2

首先,确保您通过网络抓取方法没有违反网站的使用条款。做一个优秀的网络爬虫公民

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

下载器在从同一网站下载连续页面之前应等待的时间(以秒为单位)。这可以用来限制爬行速度,以避免对服务器造成太大影响。

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

Scrapy 下载器将执行的并发(即同时)请求的最大数量。

于 2015-03-28T20:01:55.890 回答