Python 使用scrapy爬网bbs时扭曲失败

Python 使用scrapy爬网bbs时扭曲失败,python,web-scraping,scrapy,scrapy-spider,twist,Python,Web Scraping,Scrapy,Scrapy Spider,Twist,我是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.ed

我是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]信息:倾倒刮擦数据: {'downloader/exception_count':99, 'downloader/exception\u type\u count/twisted.web.\u newclient.ResponseFailed':99, “下载程序/请求字节”:36236, “下载程序/请求计数”:113, “下载程序/请求方法/计数/获取”:113, “下载程序/响应字节”:31135, “下载程序/响应计数”:14, “下载/响应状态\计数/200”:14, “dupefilter/filtered”:25, “完成原因”:“完成”, “完成时间”:datetime.datetime(2015,3,28,3,16,56677065), “物料刮取计数”:11, “日志计数/调试”:127, “日志计数/错误”:32, “日志计数/信息”:8, “请求深度最大值”:3, “收到的响应数”:14, “调度程序/出列”:113, “调度程序/出列/内存”:113, “调度程序/排队”:113, “调度程序/排队/内存”:113, “开始时间”:datetime.datetime(2015,3,28,3,16,41874807)} 2015-03-28 11:16:56+0800[nju_spider]信息: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

首先,确保你没有违反网站的使用条款,采取网站抓取的方法

接下来,您可以将
用户代理
标题设置为假装是浏览器。在
DEFAULT\u REQUEST\u 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
包实现的一个:


另一个可能的问题是你经常点击网站,考虑调整:

下载程序在此之前应等待的时间量(以秒为单位) 从同一网站下载连续页面。这是可以使用的 限制爬行速度以避免对服务器造成过大的冲击

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

将发生的最大并发(即同时)请求数 由刮片下载器执行


谢谢!我想写的网站似乎禁止太频繁的抓取,所以在我将下载延迟设置为2后,它工作得很好。