meta属性是字典,字典格式即{‘key’:'value'},字典是一种可变容器模型,可存储任意类型对象。html
request中meta参数的做用是传递信息给下一个函数,这些信息能够是任意类型的,好比值、字符串、列表、字典......方法是把要传递的信息赋值给meta字典的键,分析见以下语句(爬虫文件):python
class example(scrapy.Spider): name='example' allowed_domains=['example.com'] start_urls=['http://www.example.com'] def parse(self,response): #从start_urls中分析出的一个网址赋值给url url=response.xpath('.......').extract() #ExamleClass是在items.py中定义的,下面会写出。item自己是一个字典 item=ExampleClass() item['name']=response.xpath('.......').extract() item['htmlurl']=response.xpath('.......').extract() #经过meta参数,把item这个字典,赋值给meta(自己也是一个字典) #中的key键。Request在请求url后生成一个request对象,这个 #(含有键值'key','key'的值是字典item)meta字典 #里面的信息会被“放”在request对象里一块儿发送给parse2()函数 yield Request(url,meta={'key':item},callback='parse2') def parse2(self,response): item=response.meta['key'] #这个response已含有上述meta字典,此句将这个字典赋值给item,完成信息传递。 #这个item已经和parse中的item同样了 item['text']=response.xpath('.......').extract()#item共三个键值,到这里所有添加完毕了 yield item
items.py中语句以下:cookie
class ExampleClass(scrapy.Item): name = scrapy.Field() htmlurl = scrapy.Field() text=scrapy.Field()
meta固然是能够传递cookie的(第一种):session
下面start_requests中键‘cookiejar’是一个特殊的键,scrapy在meta中见到此键后,会自动将cookie传递到要callback的函数中。既然是键(key),就须要有值(value)与之对应,例子中给了数字1,也能够是其余值,好比任意一个字符串。dom
def start_requests(self): yield Request(url,meta={'cookiejar':1},callback=self.parse)
须要说明的是,meta给‘cookiejar’赋值除了能够代表要把cookie传递下去,还能够对cookie作标记。一个cookie表示一个会话(session),若是须要经多个会话对某网站进行爬取,能够对cookie作标记,1,2,3,4......这样scrapy就维持了多个会话。scrapy
def parse(self,response): key=response.meta['cookiejar'] #通过此操做后,key=1 yield Request(url2,meta={'cookiejar':key},callback='parse2') def parse2(self,response): pass
上面这段和下面这段是等效的:ide
def parse(self,response): yield Request(url2,meta={'cookiejar':response.meta['cookiejar']},callback='parse2') #这样cookiejar的标记符仍是数字1 def parse2(self,response): pass
传递cookie的第二种写法:函数
若是不加标记,能够用下面的写法:网站
#先引入CookieJar()方法 from scrapy.http.cookies import CookieJar
写spider方法时:url
def start_requests(self): yield Request(url,callback=self.parse)#此处写self.parse或‘parse’均可以 def parse(self,response): cj = response.meta.setdefault('cookie_jar', CookieJar()) cj.extract_cookies(response, response.request) container = cj._cookies yield Request(url2,cookies=container,meta={'key':container},callback='parse2') def parse2(self,response): pass
meta是浅复制,必要时须要深复制。
能够这样引入:
import copy meta={'key':copy.deepcopy('value')}