带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代
yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值
重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行
简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始
import scrapy
from scrapy_movie.items import ScrapyMovieItem
class MovieSpider(scrapy.Spider):
name = 'movie'
# allowed_domains = ['www.xx.com']
start_urls = ['https://www.ygdy8.net/html/gndy/oumei/index.html']
def parse(self, response):
data_list = response.xpath('//div[@class="co_content8"]//b/a[2]')
print(data_list)
for data in data_list:
src = data.xpath('./@href').extract_first()
src = "https://www.ygdy8.net" + src
name = data.xpath('./text()').extract_first()
'''
这里我们在循环里不断提取网页的链接,并通过 yield 来发起请求,并且还将函数 getInfo作为回调函数来从响应中提取所需的数据。
'''
yield scrapy.Request(url=src, callback=self.getInfo, meta={"name": name})
def getInfo(self, response):
if response.status == "200":
url = response.xpath('//div[@id="Zoom"]//a/@href').extract_first()
src_url = response.url.split('/')
src_url[-1] = url
url = "/".join(src_url)
name = response.meta("name")
movie = ScrapyMovieItem(url=url, name=name)
'''
这里的yield返回的是一个ScrapyMovieItem对象(from items)
'''
yield movie
scrapy框架会根据 yield 返回的实例类型来执行不同的操作:
- 返回 scrapy.Request 对象,scrapy框架会去获得该对象指向的链接并在请求完成后调用该对象的回调函数。
- 返回 scrapy.Item 对象,scrapy框架会将这个对象传递给 pipelines.py做进一步处理。