start_response实现

#!/usr/bin/python
#encoding:utf8

import cgi
import cgitb
import sys
import os

#Make the environ argument
environ = {}
environ['REQUEST_METHOD'] = os.environ['REQUEST_METHOD']
environ['SCRIPT_NAME'] = os.environ['SCRIPT_NAME']
environ['PATH_INFO'] = os.environ['PATH_INFO']
environ['QUERY_STRING'] = os.environ['QUERY_STRING']
environ['CONTENT_TYPE'] = os.environ['CONTENT_TYPE']
environ['CONTENT_LENGTH'] = os.environ['CONTENT_LENGTH']
environ['SERVER_NAME'] = os.environ['SERVER_NAME']
environ['SERVER_PORT'] = os.environ['SERVER_PORT']
environ['SERVER_PROTOCOL'] = os.environ['SERVER_PROTOCOL']
environ['wsgi.version'] = (1, 0)
environ['wsgi.url_scheme'] = 'http'
environ['wsgi.input']        = sys.stdin
environ['wsgi.errors']       = sys.stderr
environ['wsgi.multithread']  = False
environ['wsgi.multiprocess'] = True
environ['wsgi.run_once']     = True


#make the start_response argument
#注意,WSGI协议规定,如果没有body内容,是不能返回http response头信息的。
sent_header = False
res_status = None
res_headers = None

def write(body):
    global sent_header
    if sent_header:
        sys.stdout.write(body)
    else:
        print res_status
        for k, v in res_headers:
            print k + ': ' + v
        print
        sys.stdout.write(body)
        sent_header = True ####

def start_response(status, response_headers):
    global res_status
    global res_headers
    res_status = status
    res_headers = response_headers
    return write

#here is the application
  def application(environ, start_response):
    status = '200 OK'
    output = 'World!'
    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(12)]
    write = start_response(status, response_headers)
    write('Hello ') ###第一次write
    return [output]

#here run the application
result = application(environ, start_response)
for value in result:
    write(value)###第二次write


在Scrapy框架中,`start_requests`方法用于生成初始的请求(Request)对象。通过重写这个方法,我们可以自定义爬虫的起始点,从而控制爬虫的行为。为了实现多线程爬取,我们可以通过以下步骤来操作: 1. **定义URL列表**:首先,我们需要定义一个包含所有目标URL的列表。这些URL是爬虫将要抓取的数据源。 2. **重写start_requests方法**:在Scrapy的Spider类中,我们重写`start_requests`方法。在这个方法中,我们将遍历URL列表,为每个URL创建一个Request对象,并将这些Request对象通过yield语句返回。这样,Scrapy就会将这些Request对象加入到调度队列中,准备进行并发处理。 3. **设置并发请求数**:在Scrapy的配置文件`settings.py`中,我们可以设置`CONCURRENT_REQUESTS`参数来指定同时进行的请求数量,从而实现多线程爬取。默认情况下,这个值是16,意味着Scrapy会同时发起16个请求。 4. **启动爬虫**:完成上述设置后,我们就可以启动爬虫了。Scrapy会根据`start_requests`方法生成的Request对象和`CONCURRENT_REQUESTS`的设置,自动管理请求的发送和响应的处理,实现多线程爬取。 下面是一个简单的示例代码,展示了如何通过重写`start_requests`方法来实现多线程爬取: ```python import scrapy class MySpider(scrapy.Spider): name = 'my_spider' def start_requests(self): urls = [ 'http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3', # 更多URL... ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): # 解析响应内容 pass ``` 在这个示例中,我们定义了一个名为`MySpider`的爬虫类,它重写了`start_requests`方法来生成针对多个URL的请求。每个请求都会调用`parse`方法来处理响应。通过调整`CONCURRENT_REQUESTS`的值,我们可以控制并发请求的数量,从而实现多线程爬取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值