文档章节

爬虫入门-5-3.scrapy中meta传值

o
 osc_fmg49rzg
发布于 2019/03/20 12:56
字数 463
阅读 14
收藏 0

一 简介

meta是一个字典,它的主要作用是用来传递数据的,meta = {‘key1’:value1},如果想在下一个函数中取出value1, 只需得到上一个函数的meta[‘key1’]即可, 因为meta是随着Request产生时传递的,下一个函数得到的Response对象中就会有meta,即response.meta.

注意:为了不影响meta,应该注意传值问题:(为了解决多次for循环而出现数据覆盖,可以使用deepcopy解决)

meta={"item":deepcopy(item)}------->item=deepcopy(response.meta['item'])

二 例子

1.创建项目

scrapy startproject auto

cd auto

scarpy genspider bmw7 "autohome.com.cn"

2.代码展示:

bmw7.py:

 1 import scrapy
 2 from auto.items import AutoItem
 3 
 4 
 5 class Bmw7Spider(scrapy.Spider):
 6     name = 'bmw7'
 7     allowed_domains = ['autohome.com.cn']
 8     start_urls = ['https://car.autohome.com.cn/pic/series/153.html']
 9 
10     def parse(self, response):
11         uiboxs = response.xpath('//div[@class = "uibox"]')[1:]
12         for uibox in uiboxs:
13             category = uibox.xpath('.//div[@class = "uibox-title"]/a/text()').get()
14             urls = uibox.xpath('.//ul/li/a/@href').getall()
15             urls = list(map(lambda url: response.urljoin(url), urls))
16             item = AutoItem(category=category) # 如果放在for循环外面则图片只能保存最后一个类别
17             for detail_url in urls:
18                 yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={"item": item})
19 
20     def parse_detail(self, response):
21         img_url = response.xpath("//img[@id='img']/@src").extract_first()
22         if img_url:
23             img_url = "http:" + img_url
24             item = response.meta['item']
25             item['image_url'] = img_url
26             return item

items.py:

1 import scrapy
2 
3 
4 class AutoItem(scrapy.Item):
5     # define the fields for your item here like:
6     # name = scrapy.Field()
7     category = scrapy.Field()
8     image_url = scrapy.Field()

settings.py部分设置:

import os

IMAGES_STORE = os.path.join(os.path.abspath(os.path.dirname(__file__)), "images")
IMAGES_URLS_FIELD = 'image_url'

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}

ITEM_PIPELINES = {
   'auto.pipelines.MyImagePipeline': 1,
}

pipelines.py:

 1 from scrapy.pipelines.images import ImagesPipeline
 2 import scrapy
 3 
 4 class MyImagePipeline(ImagesPipeline):
 5     def get_media_requests(self, item, info):
 6         yield scrapy.Request(item['image_url'], meta={"item": item})
 7 
 8     def file_path(self, request, response=None, info=None):
 9         path = super(MyImagePipeline, self).file_path(request, response, info)
10         item = request.meta['item']
11         category = item['category']
12         image_name = path.replace('full/', '')  # 图片名为随机
13         return './%s/%s' % (category, image_name)

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

如何在Ruby中生成随机字符串 - How to generate a random string in Ruby

问题: I'm currently generating an 8-character pseudo-random uppercase string for "A" .. "Z": 我目前正在为“ A” ..“ Z”生成一个8个字符的伪随机大写字符串: value = ""; 8.times{......

法国红酒甜
40分钟前
12
0
Python中的mkdir -p功能[重复] - mkdir -p functionality in Python [duplicate]

问题: This question already has an answer here: 这个问题在这里已有答案: How can I safely create a nested directory? 如何安全地创建嵌套目录? 25 answers 25个答案 Is there a way...

技术盛宴
今天
15
0
原价500元的认证证书,限时免费考取!

本文作者:y****n 百度云智学院致力于为百度ABC战略(人工智能、大数据、云计算)提供人才生态体系建设,包括基于百度ABC、IoT的课程体系,整合百度优势技术能力的深度学习技术、Apollo无人车...

百度开发者中心
昨天
17
0
在virtualenv中使用Python 3 - Using Python 3 in virtualenv

问题: Using virtualenv , I run my projects with the default version of Python (2.7). 使用virtualenv ,我使用默认版本的Python(2.7)运行项目。 On one project, I need to use Pyth......

富含淀粉
今天
16
0
Python的__init__和self是做什么的? - What __init__ and self do on Python?

问题: I'm learning the Python programming language and I've came across something I don't fully understand. 我正在学习Python编程语言,遇到了一些我不太了解的东西。 In a method ......

javail
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部