我是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
答案 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下载程序执行。