帶有 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做進一步處理。