03.3.1. 定义爬虫标识
# 定义唯一标识区分爬虫,系统自动生成 name = 'douban'# 定义域爬取范围 allowed_domains = ['movie.douban.com']# 定义要爬取的网站 baseurl = 'https://movie.douban.com/top250?start='# 定义偏移值 offset = 0# 定义起始的url,系统自动生成,但是需要我们改动进行字符串拼接,方便爬取多页 start_urls = [baseurl + str(offset)]
3.3.2. 获取单条的影片信息
# xpath为response中的方法,可以将xpath表达式直接作用于该函数中# 思路:爬取任何东西要先获取它变成一个整体(标签),然后一条一条爬取里边信息构建出一个列表# 例如:[movie_name,movie_link,star,quote]这是一个标签里获取的一条电影信息# 提醒:这个地方不要想着爬取整个网页然后在区分。# 例如:[name,name,name,name][link,link,link,link][star,star,star,star] ...... moive_node = response.xpath("//div[@class='item']/div[@class='info']")# 获取moive_node里每一条电影信息(每个页面会有25个movie_node) for movie in moive_node:# 通过xpth获取每个节点的单条电影信息的内容:# xpath函数返回的为列表,列表中存放的数据为Selector类型的数据,所以返回给我们的是一个对象而不是我们想要的数据# 我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出 # 影片名称 movie_name = movie.xpath("./div[@class='hd']/a/span[@class='title'][1]/text()").extract() # 影片连接 movie_link = movie.xpath("./div[@class='hd']/a/@href").extract() # 影评评分 star = movie.xpath("./div[@class='bd']/div[@class='star']/span[@class='rating_num']/text()").extract() # 影片引言 quote = movie.xpath("./div[@class='bd']/p[@class='quote']/span[@class='inq']/text()").extract() # 部分影片没有引言,所以要做判断处理 if quote: quote = quote[0] else: quote = "" # 将解析到的数据封装至items对象中 item = StudyItem() # 下面是提取字典中的数据(值) item['movie_name'] = movie_name[0] item['movie_link'] = movie_link[0] item['star'] = star[0] # 此处注意不要写[0],因为上边判断的时候已经提取了第一个元素如果在取[0]只能取到第一个数字 item['quote'] = quote # 提交item到管道文件(pipelines.py) yield item
3.3.3. 获取所有电影信息
# 此处的if应该在for循环外面# 如果写在for循环里的话就表示每提取一条信息就执行一下if# 写在外边的话就是当前页面所有信息提取完了再执行下面代码# 通过页面url分析我们得知最后一页是225但是不能大于等于哦! if self.offset < 225: # 通过分析得知步进值为25 self.offset += 25 # 拼接url获取下一页的url url = self.baseurl + str(self.offset) # 通过回调函数callback将下一页的url提交给parse再进行电影信息解析提取 # for循环25次,if的代码执行一次 # 注:for里面相当于每个电影,if里面相当于每一页 yield scrapy.Request(url, callback=self.parse)# 注意:此方案不是最佳方案因为判断条件我写死了(因为豆瓣top250不会进行数据更新,最多250个)# 思路1:可以通过下一页标签用xpath提取下一页,进行url拼接,然后再传递url# 需要判断什么情况下下一页是灰色,例如://a[[url=home.php?mod=space&uid=341152]@Class[/url] = next] == 0的时候# 还要注意第一页的上一页也是灰色,所以判断要满足某两个条件才行# 思路2: 可以通过获取当前网站的总页数来进行数据爬取