小白学 Scrapy 框架求解答问题

2018-04-02 21:37:17 +08:00
 vcent

请问 spider 里面俩处理函数 第一个函数有循环每循环一次 yield 一个 Request,callback 第二个函数,scrapy 框架执行是先把第一个函数循环循环完然后按照队列区执行第二个函数?还是 yield 完也该就去执行第二个 第一个也同时进行着??具体问题如下:爬取豆瓣 250 第一页电影,后两个参数 film_info,play_link 是进详情页面获取的,调试发现是先循环完第一个函数在执行第二个函数的,所以给第二个函数的参数是第一个函数最后一次循环结果导致数据重复严重。Scrapy 不是异步的????求解答 class TestSpider(scrapy.Spider): name = 'test' allowed_domains = ['douban.com'] start_urls = ['https://movie.douban.com/top250']

def parse(self, response):
    item=items.DoubanItem()
    movies=response.css('.grid_view li')
    for tmp in movies:
        #排名
        item['ranking']=tmp.css('em::text').extract_first(default='')
        #电影名
        item['film_name']=tmp.css('.title::text').extract_first(default='')
        #电影精髓
        item['film_desc']=tmp.css('.inq::text').extract_first(default='')
        #分数
        item['film_score']=tmp.css('.rating_num::text').extract_first(default='')
        #封面链接
        item['film_cover']=tmp.css('img::attr(src)').extract_first(default='')
        #是否可播放
        play_button=tmp.css('.playable').extract_first(default='')
        if play_button :
            yield Request(tmp.css('.hd a::attr(href)').extract_first(),callback=self.parse_detail,meta={'key':item})
        else:
            item['play_link'],item['film_info']=('N/A','N/A')
            yield item
        
def parse_detail(self,response):
    result=copy.deepcopy(response.meta['key'])
    result['film_info']=response.css('[property="v:summary"]::text').extract_first(default='').strip()
    resource_list=response.css('.bs li')
    waylist=[]
    for tmp in resource_list:
        resource=tmp.css('a::text').extract_first(default='').strip()
        vip=tmp.css('span span::text').extract_first(default='').strip()
        waylist.append(resource+vip)
    result['play_link']=','.join(waylist)
    yield result

pipline 就是简单的存储进 mongodb,结果是
数据都是重复的,除了第二个函数的两个字段不重复其他字段都和第 25 调数据一样额,,,,表达不清楚,如果有那位好心人可以帮忙看下,受累加 Q 1009377243 多谢。。实在没招拉

1665 次点击
所在节点    Python
1 条回复
farverfull
2018-04-03 17:55:37 +08:00
你把 item=items.DoubanItem()放进 for in 里,但不建议这么做,meta 直接传递数据吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/443699

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX