Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scrapy:如何测试每个请求之间的延迟_Python_Scrapy - Fatal编程技术网

Python scrapy:如何测试每个请求之间的延迟

Python scrapy:如何测试每个请求之间的延迟,python,scrapy,Python,Scrapy,我设置了每个请求之间的延迟,希望看到效果。但似乎什么也没发生。我设定 DOWNLOAD_DELAY=5 CONCURRENT_REQUESTS=1 CONCURRNT_REQUESTS_PER_IP=1 RANDOM_DOWNLOAD_DELY=False 我想如果它起作用,我会看到每个请求之间有5秒的延迟。但它没有发生 以下代码段是Spider: class Useragent(BaseSpider): name = 'useragent' settings.ove

我设置了每个请求之间的延迟,希望看到效果。但似乎什么也没发生。我设定

DOWNLOAD_DELAY=5

CONCURRENT_REQUESTS=1

CONCURRNT_REQUESTS_PER_IP=1

RANDOM_DOWNLOAD_DELY=False
我想如果它起作用,我会看到每个请求之间有5秒的延迟。但它没有发生

以下代码段是Spider:

class Useragent(BaseSpider):

    name = 'useragent'

    settings.overrides['DOWNLOAD_DELAY'] = 5
    settings.overrides['CONCURRENT_REQUESTS'] = 1
    settings.overrides['CONCURRENT_REQUESTS_PER_DOMAIN'] = 1
    settings.overrides['RANDOM_DOWNLOAD_DELAY'] = False

    fn_useragents = "utils/useragents.txt"
    fp_useragents = open(fn_useragents, 'rb')
    total_lines = len(fp_useragents.readlines())
    fp_useragents.close()

    if not os.path.isdir("data"):
        os.mkdir("data")
    fn_log = "data/log.txt"
    fp_log = open(fn_log, "ab+")

    def start_requests(self):
        urls = [
            'http://www.dangdang.com',
            'http://www.360buy.com',
            'http://www.amazon.com.cn',
            'http://www.taobao.com'
            ]

        for url in urls:
            ua = linecache.getline(Useragent.fn_useragents, randint(1, Useragent.total_lines)).strip()
            url_headers = {'User-Agent': ua}
            yield Request(url, callback=self.parse_origin, headers=url_headers)

    def parse_origin(self, response):
        current_url = response.url
        headers = response.request.headers

        data_log = current_url
        for k, v in headers.items():
            header = "%s\t%s" % (k, v)
            data_log = "\n".join((data_log, header))
        Useragent.fp_log.write("%s\n" % data_log)
更新

我编写了另一个spider来查看设置下载延迟的效果,代码如下:

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.conf import settings
import sys, os, time

reload(sys)
sys.setdefaultencoding('utf-8')

class TestCrawl(CrawlSpider):

    name = 'crawldelay'
    start_urls = [
        'http://www.dangdang.com',
        ]

    rules = (
        Rule(SgmlLinkExtractor(allow=('.+'),), callback="parse_origin"),
        )

    def __init__(self):
        CrawlSpider.__init__(self)
        if not os.path.isdir("data"):
            os.mkdir("data")
        self.fn_log = "data/log.txt"
        self.fp_log = open(self.fn_log, 'ab+')

        settings.overrides['DOWNLOAD_DELAY'] = 60
        settings.overrides['RANDOM_DOWNLOAD_DELAY'] = False
        settings.overrides['CONCURRENT_REQUESTS'] = 1
        settings.overrides['CONCURRENT_REQUESTS_PER_IP'] = 1

    def parse_origin(self, response):
        current_url = response.url
        data_log = "%s\n%s\n\n" % (current_url, time.asctime())
        self.fp_log.write(data_log)
以下是我用来查看设置下载延迟效果的日志文件的一部分:

http://living.dangdang.com/furniture
Mon Aug 27 10:49:50 2012

http://static.dangdang.com/topic/744/200778.shtml
Mon Aug 27 10:49:50 2012

http://survey.dangdang.com/html/2389.html
Mon Aug 27 10:49:50 2012

http://fashion.dangdang.com/watch
Mon Aug 27 10:49:50 2012

https://login.dangdang.com/signin.aspx?returnurl=http://customer.dangdang.com/wishlist/
Mon Aug 27 10:49:50 2012

http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001051000098
Mon Aug 27 10:49:51 2012

https://ss.cnnic.cn/verifyseal.dll?pa=2940051&sn=2010091900100002234
Mon Aug 27 10:49:51 2012

但是下载延迟似乎没有明显的效果。

您只能将属性赋值和方法直接放在类主体中。如果要初始化对象代码,则需要重写
\uuuuu init\uuuu()


只能将属性指定和方法直接放置在类主体中。如果要初始化对象代码,则需要重写
\uuuuu init\uuuu()


这是由于执行了
dnscache
(延迟)。
每个IP的并发请求
仅适用于第二个相同的域请求。
您可以覆盖
LocalCache
get()
方法,使其返回固定值。
它会导致scrapy看到对同一IP的每个请求



测试您的蜘蛛:

scrapy crawl crawldelay -s CONCURRENT_REQUESTS_PER_IP=1 -s DOWNLOAD_DELAY=1

这是由于执行了
dnscache
(延迟)。
每个IP的并发请求
仅适用于第二个相同的域请求。
您可以覆盖
LocalCache
get()
方法,使其返回固定值。
它会导致scrapy看到对同一IP的每个请求



测试您的蜘蛛:

scrapy crawl crawldelay -s CONCURRENT_REQUESTS_PER_IP=1 -s DOWNLOAD_DELAY=1

我按照你说的重建了我的源文件。但它很快就爬过了网页,我看不出每个请求都会有延迟。也许我的想法是错的。我只是想看看下载效果。可能会将下载延迟增加到60,并包括日志输出供我们查看。很抱歉这么晚才回复。我更新了我的问题并通过了代码下面的结果。您是否尝试将下载延迟放入实际的settings.py文件中?我已经尝试并得到了相同的结果。我认为把下载延迟放在settings.py或者放在spider中也有同样的效果。我按照你说的重建了我的源文件。但它很快就爬过了网页,我看不出每个请求都会有延迟。也许我的想法是错的。我只是想看看下载效果。可能会将下载延迟增加到60,并包括日志输出供我们查看。很抱歉这么晚才回复。我更新了我的问题并通过了代码下面的结果。您是否尝试将下载延迟放入实际的settings.py文件中?我已经尝试并得到了相同的结果。我认为把下载延迟放在settings.py中或者放在spider中也有同样的效果。你为什么把下载延迟放在覆盖中?直接放在类主体中:
class Useragent(BaseSpider):\n name='Useragent'\n download\u delay=60
为什么要将download\u delay放在覆盖中?直接放在类主体中:
class Useragent(BaseSpider):\n name='Useragent'\n download\u delay=60
scrapy crawl crawldelay -s CONCURRENT_REQUESTS_PER_IP=1 -s DOWNLOAD_DELAY=1