瓜子二手车示例代码不解

来源:6-2 项目作业

富百世

2021-01-15 22:21:41

老师:如下代码:

#解析二手车详情页
def handle_car_info(self,response):
#获取到列表页里面的二手车的名称,以及二手车的URL
   # 通过车源号进行去重,通过正则表达式,车源号:HC-73829610
   car_id_search = re.compile(r"车源号:(.*?)\s+")
#创建items内部定义的字段的实例
   car_info = GuaziScrapyProjectItem()
#car_id
   car_info['car_id'] = car_id_search.search(response.text).group(1)
#通过meta传递过来的car_name
   car_info['car_name'] = response.request.meta['car_name']
# 从哪个连接抓取过来的数据
   car_info['from_url'] = response.request.meta['car_url']
car_info['car_price'] = response.xpath("//span[@class='pricestype']/text()").extract_first().strip()
car_info['license_time'] = response.xpath("//ul[@class='assort clearfix']/li[@class='one']/span/text()").extract_first().strip()
car_info['km_info'] = response.xpath("//ul[@class='assort clearfix']/li[@class='two']/span/text()").extract_first().strip()
# 上牌地
   car_info['license_location'] = response.xpath("//ul[@class='assort clearfix']/li[@class='three']/span/text()").extract()[0].strip()
# 排量信息
   car_info['desplacement_info'] = response.xpath("//ul[@class='assort clearfix']/li[@class='three']/span/text()").extract()[1].strip()
# 变速箱,手动挡还是自动挡
   car_info['transmission_case'] = response.xpath("//ul[@class='assort clearfix']/li[@class='last']/span/text()").extract_first().strip()
yield car_info

其中yield car_info是什么作用?yield是什么意思?

pipelines.py中如下代码:

​class GuaziScrapyProjectPipeline(object):
def process_item(self, item, spider):
mongo.save_data('guazi_data',item)
return item

在项目中我也没有找到有地方调用process_item()方法,没有传递item参数,怎么就实现保存数据到数据库了呢?求解,谢谢!

写回答

1回答

好帮手慕燕燕

2021-01-16

同学,你好!对同学的疑问做如下解答:

1、yield car_info是将car_info对象传递给pipelines.py,做进一步处理

2、scrapy框架会根据yield返回的实例类型来执行不同的操作,如果是scrapy.Request对象,scrapy框架会去获得该对象指向的链接,发起请求,通过callback参数为这个请求添加回调函数,在请求完成之后会将响应作为参数传递给回调函数,代码示例如下:

yield scrapy.Request(url=car_list_info['car_url'],
           callback=self.handle_car_info,
           dont_filter=True,meta=car_list_info,
           errback=self.handle_err)

如果是scrapy.Item对象,scrapy框架会将这个对象传递给pipelines.py做进一步处理,代码示例如下:

car_info = GuaziScrapyProjectItem()
# car_id
car_info['car_id'] = car_id_search.search(response.text).group(1)
# 通过meta传递过来的car_name
car_info['car_name'] = response.request.meta['car_name']
yield car_info
3、GuaziScrapyProjectPipeline是在settings.py中设置启用的,当scrapy获取到数据之后,并且已经定义了items,settings.py启用了pipelines,那么就无需自己去调用pipelines里面的代码,scrapy框架自动去调用,pipeline每次接收item后,就会执行下面的process_item()方法

http://img.mukewang.com/climg/60028896093b260212710227.jpg

祝学习愉快~

0

0 学习 · 1672 问题

查看课程