瓜子二手车示例代码不解
来源: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()3、GuaziScrapyProjectPipeline是在settings.py中设置启用的,当scrapy获取到数据之后,并且已经定义了items,settings.py启用了pipelines,那么就无需自己去调用pipelines里面的代码,scrapy框架自动去调用,pipeline每次接收item后,就会执行下面的process_item()方法
# 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
祝学习愉快~
相似问题