scrapy初探(抓取豆瓣top250)

抓取的内容:电影的title,director,评分,名言和详情页的电影简介,一共爬取五个内容。涉及主页的爬取和详情页的爬取。用scrapy可以很简单的实现这次爬取。

此次涉及 的除了scrapy框架外还有正则表达式的编写等知识。

豆瓣250 之前也爬取过,用的selenium自动化,这次用scrapy爬取一次,用于scrapy的初探

首先建立一个project:
scrapy startproject doubanmovie
接下来建立一个爬虫文件:
scrapy genspider doubanspider douban.com

接下来就是正式编写爬虫了。

主体 doubanspider.py 文件了

# _*_ coding:utf-8 _*_

import scrapy
from scrapy.selector import Selector
from doubanmovie.items import DoubanmovieItem

class MovieSpider(scrapy.Spider):

    name = "Douban"  
    start_urls = [
        'https://movie.douban.com/top250?start=0&filter='
    ]

    def parse(self,response):
        lis = response.xpath('.//div[@class="article"]/ol[@class="grid_view"]/li')
        for li in lis:
        	# 创建一个item实例
            item = DoubanmovieItem()            
            title = li.xpath('.//div[@class="hd"]/a/span/text()').get()
            # 这个*[\u4e00-\u9fa5]*是匹配汉字的正则表达式
            director = li.xpath('.//div[@class="bd"]/p[1]/text()').re('([\u4e00-\u9fa5]?·?[\u4e00-\u9fa5]+?)\s')[0]
            # 用正则提取上映时间,由于是提取出来是一个list,所以用join方法,组成一个字符串
            time_list = li.xpath('.//div[@class="bd"]/p[1]/text()').re('\d+?')          
            time = ''.join(time_list)
            rate = li.xpath('.//span[@class="rating_num"]/text()').get()
            quote = li.xpath('.//p[@class="quote"]/span/text()').get()
            detail_link = li.xpath('.//div[@class="hd"]/a/@href').get()
            
            # 因为有几部电影没有名言,所以这里加了一个if判断            
            item['title'] = title
            item['director'] = director
            item['time'] = time
            item['rate'] = rate
            if quote:
                item['quote'] = quote
    
            request = scrapy.Request(url=detail_link,meta={"key":item},callback=self.parse_detail)
             # yield关键字其实相当于一个return,每次调用都返回它后面的变量
            yield request
           
        next_page = response.xpath('//span[@class="next"]/a/@href')
        # 对页面进行的一个循环,通过回调parse函数,对每个主页都执行一个parse方法
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

    def parse_detail(self,response):
    	# 回调函数中有一个response.meta方法可以取之前传递进来的值
        item = response.meta['key']    
        sele = Selector(response)
        short = sele.xpath('.//div[@id="link-report"]/span[1]/text()').extract_first()
        item['short'] = short
        yield item

还有 setting.py,pipelines.py,items.py文件的设置什么的都和上一篇一样,并没有很复杂的设置。

在这里插入图片描述

作者:killeri
来源:优快云
原文:https://blog.youkuaiyun.com/killeri/article/details/80214177

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值