scrapy yield函数

Posted lianghaiming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy yield函数相关的知识,希望对你有一定的参考价值。

技术图片
 1 import scrapy
 2 from text_info.items import TextInfoItem
 3 
 4 class A50zwSpider(scrapy.Spider):
 5     name = 50zw
 6     allowed_domains = [m.50zw.la]
 7     start_urls = [http://m.50zw.la/wapsort/1_1.html]
 8 
 9     #主站链接 用来拼接
10     base_site = http://m.50zw.la
11 
12     def parse(self, response):
13         book_urls = response.xpath(//table[@class="list-item"]//a/@href).extract()
14 
15         for book_url in book_urls:
16             url = self.base_site + book_url
17             yield scrapy.Request(url, callback=self.getInfo)
18 
19         #获取下一页
20         next_page_url = self.base_site + response.xpath(//table[@class="page-book"]//a[contains(text(),"下一页")]/@href).extract()[0]
21         yield scrapy.Request(next_page_url, callback=self.parse)
22 
23     def getInfo(self, response):
24         item = TextInfoItem()
25 
26         #提取信息
27         item[text_id] = response.url.split(_)[1].replace(/, ‘‘)
28         item[text_name] = response.xpath(//table[1]//p/strong/text()).extract()[0]
29         item[text_author] = response.xpath(//table[1]//p/a/text()).extract()[0]
30         item[text_type] = response.xpath(//table[1]//p/a/text()).extract()[1]
31         item[text_status] = response.xpath(//table[1]//p/text()).extract()[2][3:]
32         item[text_latest] = response.xpath(//table[1]//p[5]/text()).extract()[0][3:]
33         item[text_intro] = response.xpath(//div[@class="intro"]/text()).extract()[0]
34 
35         yield item
spider示例(含yield)
技术图片
scrapy错误:yield scrapy.Request()不执行、失效、Filtered offsite request to错误。首先我们在Request()方法里面添加这么一个东东:
yield Request(url, callback=self.parse_item, dont_filter=True)
如果发现成功执行,那你就得检查一下你的:allowed_domains,看看前面是不是添加了:http://  ,如(错误写法):
 allowed_domains = ["http://www.baidu.com"]

正确写法:
allowed_domains = ["www.baidu.com"]
去掉之后,把dont_filter=True也去掉,也能正常执行,其实这里是allowed_domains和去重出现了冲突,scrapy allowed_domains判断不严谨产生的问题,所以书写allowed_domains的时候一定不要加:http://


其次 yield必须出现在response的方法内部 即必须成对使用

      def parse_link_street(self, response):
                    yield scrapy.Request(
                        url=‘’
                        meta=‘’,
                        callback=‘’,
                        dont_filter=True
                    )
而不能出现如下情况

  def parse_link_street(self):
                    yield scrapy.Request(
                        url=‘’
                        meta=‘’,
                        callback=‘’,
                        dont_filter=True
                    )
参考:https://blog.csdn.net/weixin_40976261/article/details/88626108
yield无效的情况
技术图片
 1 一、
 2 这里我们通过 yield 来发起一个请求,并通过 callback 参数为这个请求添加回调函数,在请求完成之后会将响应作为参数传递给回调函数。
 3 scrapy框架会根据 yield 返回的实例类型来执行不同的操作,如果是 scrapy.Request 对象,scrapy框架会去获得该对象指向的链接并在请求完成后调用该对象的回调函数。
 4 如果是 scrapy.Item 对象,scrapy框架会将这个对象传递给 pipelines.py做进一步处理。
 5 这里我们有三个地方使用了 yield ,第一个地方是:
 6  for book_url in book_urls:
 7         url = self.base_site + book_url
 8         yield scrapy.Request(url, callback=self.getInfo)
 9 
10 二、
11 #获取下一页
12 next_page_url = self.base_site + response.xpath(//table[@class="page-book"]//a[contains(text(),"下一页")]/@href).extract()[0]
13 yield scrapy.Request(next_page_url, callback=self.parse)
14 这里是在爬取完一页的信息后,我们在当前页面获取到了下一页的链接,然后通过 yield 发起请求,并且将 parse 自己作为回调函数来处理下一页的响应。
15 这有点像递归,不过递归是函数自己调用自己,这里看起来好像是 parse 调用了自己,但实际上 parse 是由 scrapy框架在获得响应后调用的。
16 
17 
18 三、
19 
20 def getInfo(self, response):
21         item = TextInfoItem()
22         
23         ... ...
24         
25         item[text_intro] = response.xpath(//div[@class="intro"]/text()).extract()[0]
26         yield item
27 
28 这里我们通过 yield 返回的不是 Request 对象,而是一个 TextInfoItem 对象。
29 
30 scrap有框架获得这个对象之后,会将这个对象传递给 pipelines.py来做进一步处理。
31 
32 我们将在 pipelines.py里将传递过来的 scrapy.Item 对象保存到数据库里去。
33 
34 作者:渔父歌
35 链接:https://www.jianshu.com/p/7c1a084853d8
36 来源:简书
37 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
yield的实际用法

以上是关于scrapy yield函数的主要内容,如果未能解决你的问题,请参考以下文章

scrapy使用yield返回Request的步骤是怎么样的

爬虫:Scrapy 中 yield 和 return 的区别

scrapy 为什么要用yield item 而不用yield dict来传输数据

scrapy主动退出爬虫的代码片段(python3)

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy使用yield返回Request的步骤是怎么样的