鱼C论坛

 找回密码
 立即注册
查看: 616|回复: 2

(关于分布式爬虫的yield函数)请大家帮我瞧一瞧哪儿错了,进来坐坐

[复制链接]
发表于 2019-3-17 14:05:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 DalaoK 于 2019-3-17 14:11 编辑
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from scrapy_redis.spiders import RedisSpider
  4. from copy import deepcopy

  5. class DanddangSpider(RedisSpider):
  6.         name = 'danddang'
  7.         redis_key='dangdang'
  8.         allowed_domains = ['book.dangdang.com']
  9.         #start_urls = ['http://book.dangdang.com/']

  10.         def parse(self, response):
  11.                 big_li=response.xpath('//div[@class="con flq_body"]/div')
  12.                 for dl in big_li:
  13.                         item={}
  14.                         item['dl_name']=dl.xpath('./dl/dt//text()').extract()
  15.                         item['dl_name']=[i.strip() for i in item['dl_name'] if len(i.strip())>0]
  16.                         middle_list=dl.xpath('.//dl[@class="inner_dl"]')
  17.                         print(middle_list)
  18.                         for dt in middle_list:
  19.                                 item['middle_name']=dt.xpath('./dt//text()').extract()
  20.                                 item['middle_name']=[i.strip() for i in item['middle_name'] if len(i.strip())>0]
  21.                                 little_list=dt.xpath('./dd/a')
  22.                                 for a in little_list:
  23.                                         item['little_name']=a.xpath('./@title').extract_first().strip()
  24.                                         item['little_url']=a.xpath('./@href').extract_first()
  25.                                         yield scrapy.Request(
  26.                                                 item['little_url'],
  27.                                                 callback=self.parse_middle,
  28.                                                 meta={'item':deepcopy(item)}
  29.                                                 )
  30.         def parse_middle(self, response):
  31.                 item=response.meta['item']
  32.                 li_list=response.xpath('//div[@class="con body"]//li')
  33.                 for li in li_list:
  34.                         item['book_name']=li.xpath('./a/@title').extract_first()
  35.                         item['book_img=']=li.xpath('./a/img/@data-original').extract_first()
  36.                         if item['book_img='] is None:
  37.                                 item['book_img=']=li.xpath('./a/img/@src').extract_first()
  38.                         item['book_url']=li.xpath('./a/@href').extract_first()
  39.                         #价格拼接
  40.                         book_price_num=li.xpath('./p[@class="price"]//span[@class="num"]/text()').extract_first()
  41.                         book_price_tail=li.xpath('./p[@class="price"]//span[@class="tail"]/text()').extract_first()
  42.                         item['book_price']=book_price_num+book_price_tail
  43.                         e_book_price_num=li.xpath('./span[@class="ebookprice_n"]/span[@class="num"]/text()').extract_first()
  44.                         e_book_price_tail=li.xpath('./span[@class="ebookprice_n"]/span[@class="tail"]/text()').extract_first()
  45.                         try:
  46.                                 item['e_book_price']=e_book_price_num+e_book_price_tail
  47.                         except:
  48.                                 item['e_book_price']="无电子书价格"
  49.                         print(item)
  50.                         print('--------------------------------')
  51.                         yield scrapy.Request(
  52.                                 item['book_url'],
  53.                                 callback=self.parse_last,
  54.                                 meta={'item':deepcopy(item)}
  55.                                 )
  56.                 #翻页
  57.                
  58.         def parse_last(self, response):
  59.                 item=response.meta['item']
  60.                 print('=========')
  61.                 item['book_scr']=response.xpath('//div[class="name_info"]/h2/text()').extract_first().strip()
  62.                 item['book_author']=response.xpath('//span[@id="author"]/a/text()').extract()
  63.                 print(item)
  64.                 print('==============================')
复制代码

翻页的步骤还没有写,忽略就好。分布式爬虫,主机和奴隶端都在一台计算机上。
执行的时候总是最后一个步骤执行不到  也就是最后一个yield scrapy.Request()不执行!我之前另一个爬虫已经遇到过这种问题了。我觉得是不是yield有次数限制???
还是我的程序错了?我觉得主要就是后十行代码有问题。请大家帮我瞧一瞧吧


{'dl_name': ['特色书单'], 'middle_name': ['文艺'], 'little_name': '场景书单:总有本小说在案头', 'little_url': 'http://book.dangdang.com/20180524_jnfi', 'book_name': '刺杀骑士团长:村上春树暌违7年新长篇,林少华激赏翻译,书名又译骑士团长杀人 事件', 'book_img=': 'http://img3m8.ddimg.cn/42/10/25228608-1_b_20.jpg', 'book_url': 'http://product.dangdang.com/25228608.html', 'book_price': '61.80', 'e_book_price': '32.99'}
--------------------------------
{'dl_name': ['特色书单'], 'middle_name': ['文艺'], 'little_name': '场景书单:总有本小说在案头', 'little_url': 'http://book.dangdang.com/20180524_jnfi', 'book_name': '一个叫欧维的男人决定去死(林彦俊、池昌旭、汤姆?汉克斯等男神推荐的幸福之书 )', 'book_img=': 'http://img3m9.ddimg.cn/44/12/25093079-1_b_9.jpg', 'book_url': 'http://product.dangdang.com/25093079.html', 'book_price': '20.70', 'e_book_price': '无电子书价格'}
--------------------------------
{'dl_name': ['特色书单'], 'middle_name': ['文艺'], 'little_name': '场景书单:总有本小说在案头', 'little_url': 'http://book.dangdang.com/20180524_jnfi', 'book_name': '白天的房子,夜晚的房子 / 2018国际布克奖获得者、诺贝尔文学奖热门人选代表作', 'book_img=': 'http://img3m7.ddimg.cn/69/5/25189827-1_b_5.jpg', 'book_url': 'http://product.dangdang.com/25189827.html', 'book_price': '45.00', 'e_book_price': '36.00'}
--------------------------------
这里是执行后的一部分内容   很明显可以看出  数据没有从yield scrapy.Request到最后一个函数中去。。。我想应该是最后一个yield函数  执行失败了。
但是我却不知道为什么  好痛苦啊  看起来也没错啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-17 14:07:27 | 显示全部楼层
{'dl_name': ['特色书单'], 'middle_name': ['文艺'], 'little_name': '场景书单:总有本小说在案头', 'little_url': 'http://book.dangdang.com/20180524_jnfi', 'book_name': '一个叫欧维的男人决定去死(林彦俊、池昌旭、汤姆?汉克斯等男神推荐的幸福之书 )', 'book_img=': 'http://img3m9.ddimg.cn/44/12/25093079-1_b_9.jpg', 'book_url': 'http://product.dangdang.com/25093079.html', 'book_price': '20.70', 'e_book_price': '无电子书价格'}
--------------------------------
{'dl_name': ['特色书单'], 'middle_name': ['文艺'], 'little_name': '场景书单:总有本小说在案头', 'little_url': 'http://book.dangdang.com/20180524_jnfi', 'book_name': '白天的房子,夜晚的房子 / 2018国际布克奖获得者、诺贝尔文学奖热门人选代表作', 'book_img=': 'http://img3m7.ddimg.cn/69/5/25189827-1_b_5.jpg', 'book_url': 'http://product.dangdang.com/25189827.html', 'book_price': '45.00', 'e_book_price': '36.00'}
这里是执行后的内容的一部分  可以看到根本就没有从最后的yield走到最后一个函数中去!   到底为甚么???好痛苦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-14 15:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表