|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 DalaoK 于 2019-3-17 14:11 编辑
- # -*- coding: utf-8 -*-
- import scrapy
- from scrapy_redis.spiders import RedisSpider
- from copy import deepcopy
- class DanddangSpider(RedisSpider):
- name = 'danddang'
- redis_key='dangdang'
- allowed_domains = ['book.dangdang.com']
- #start_urls = ['http://book.dangdang.com/']
- def parse(self, response):
- big_li=response.xpath('//div[@class="con flq_body"]/div')
- for dl in big_li:
- item={}
- item['dl_name']=dl.xpath('./dl/dt//text()').extract()
- item['dl_name']=[i.strip() for i in item['dl_name'] if len(i.strip())>0]
- middle_list=dl.xpath('.//dl[@class="inner_dl"]')
- print(middle_list)
- for dt in middle_list:
- item['middle_name']=dt.xpath('./dt//text()').extract()
- item['middle_name']=[i.strip() for i in item['middle_name'] if len(i.strip())>0]
- little_list=dt.xpath('./dd/a')
- for a in little_list:
- item['little_name']=a.xpath('./@title').extract_first().strip()
- item['little_url']=a.xpath('./@href').extract_first()
- yield scrapy.Request(
- item['little_url'],
- callback=self.parse_middle,
- meta={'item':deepcopy(item)}
- )
- def parse_middle(self, response):
- item=response.meta['item']
- li_list=response.xpath('//div[@class="con body"]//li')
- for li in li_list:
- item['book_name']=li.xpath('./a/@title').extract_first()
- item['book_img=']=li.xpath('./a/img/@data-original').extract_first()
- if item['book_img='] is None:
- item['book_img=']=li.xpath('./a/img/@src').extract_first()
- item['book_url']=li.xpath('./a/@href').extract_first()
- #价格拼接
- book_price_num=li.xpath('./p[@class="price"]//span[@class="num"]/text()').extract_first()
- book_price_tail=li.xpath('./p[@class="price"]//span[@class="tail"]/text()').extract_first()
- item['book_price']=book_price_num+book_price_tail
- e_book_price_num=li.xpath('./span[@class="ebookprice_n"]/span[@class="num"]/text()').extract_first()
- e_book_price_tail=li.xpath('./span[@class="ebookprice_n"]/span[@class="tail"]/text()').extract_first()
- try:
- item['e_book_price']=e_book_price_num+e_book_price_tail
- except:
- item['e_book_price']="无电子书价格"
- print(item)
- print('--------------------------------')
- yield scrapy.Request(
- item['book_url'],
- callback=self.parse_last,
- meta={'item':deepcopy(item)}
- )
- #翻页
-
- def parse_last(self, response):
- item=response.meta['item']
- print('=========')
- item['book_scr']=response.xpath('//div[class="name_info"]/h2/text()').extract_first().strip()
- item['book_author']=response.xpath('//span[@id="author"]/a/text()').extract()
- print(item)
- 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函数 执行失败了。
但是我却不知道为什么 好痛苦啊 看起来也没错啊 |
|