03.3.1. 定义爬虫标识

  1. # 定义唯一标识区分爬虫,系统自动生成
  2. name = 'douban'
  3. # 定义域爬取范围
  4. allowed_domains = ['movie.douban.com']
  5. # 定义要爬取的网站
  6. baseurl = 'https://movie.douban.com/top250?start='
  7. # 定义偏移值
  8. offset = 0
  9. # 定义起始的url,系统自动生成,但是需要我们改动进行字符串拼接,方便爬取多页
  10. start_urls = [baseurl + str(offset)]

3.3.2. 获取单条的影片信息

  1. # xpath为response中的方法,可以将xpath表达式直接作用于该函数中
  2. # 思路:爬取任何东西要先获取它变成一个整体(标签),然后一条一条爬取里边信息构建出一个列表
  3. # 例如:[movie_name,movie_link,star,quote]这是一个标签里获取的一条电影信息
  4. # 提醒:这个地方不要想着爬取整个网页然后在区分。
  5. # 例如:[name,name,name,name][link,link,link,link][star,star,star,star] ......
  6. moive_node = response.xpath("//div[@class='item']/div[@class='info']")
  7. # 获取moive_node里每一条电影信息(每个页面会有25个movie_node)
  8. for movie in moive_node:
  9. # 通过xpth获取每个节点的单条电影信息的内容:
  10. # xpath函数返回的为列表,列表中存放的数据为Selector类型的数据,所以返回给我们的是一个对象而不是我们想要的数据
  11. # 我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出
  12. # 影片名称
  13. movie_name = movie.xpath("./div[@class='hd']/a/span[@class='title'][1]/text()").extract()
  14. # 影片连接
  15. movie_link = movie.xpath("./div[@class='hd']/a/@href").extract()
  16. # 影评评分
  17. star = movie.xpath("./div[@class='bd']/div[@class='star']/span[@class='rating_num']/text()").extract()
  18. # 影片引言
  19. quote = movie.xpath("./div[@class='bd']/p[@class='quote']/span[@class='inq']/text()").extract()
  20. # 部分影片没有引言,所以要做判断处理
  21. if quote:
  22. quote = quote[0]
  23. else:
  24. quote = ""
  25. # 将解析到的数据封装至items对象中
  26. item = StudyItem()
  27. # 下面是提取字典中的数据(值)
  28. item['movie_name'] = movie_name[0]
  29. item['movie_link'] = movie_link[0]
  30. item['star'] = star[0]
  31. # 此处注意不要写[0],因为上边判断的时候已经提取了第一个元素如果在取[0]只能取到第一个数字
  32. item['quote'] = quote
  33. # 提交item到管道文件(pipelines.py)
  34. yield item

3.3.3. 获取所有电影信息

  1. # 此处的if应该在for循环外面
  2. # 如果写在for循环里的话就表示每提取一条信息就执行一下if
  3. # 写在外边的话就是当前页面所有信息提取完了再执行下面代码
  4. # 通过页面url分析我们得知最后一页是225但是不能大于等于哦!
  5. if self.offset < 225:
  6. # 通过分析得知步进值为25
  7. self.offset += 25
  8. # 拼接url获取下一页的url
  9. url = self.baseurl + str(self.offset)
  10. # 通过回调函数callback将下一页的url提交给parse再进行电影信息解析提取
  11. # for循环25次,if的代码执行一次
  12. # 注:for里面相当于每个电影,if里面相当于每一页
  13. yield scrapy.Request(url, callback=self.parse)
  14. # 注意:此方案不是最佳方案因为判断条件我写死了(因为豆瓣top250不会进行数据更新,最多250个)
  15. # 思路1:可以通过下一页标签用xpath提取下一页,进行url拼接,然后再传递url
  16. # 需要判断什么情况下下一页是灰色,例如://a[[url=home.php?mod=space&uid=341152]@Class[/url] = next] == 0的时候
  17. # 还要注意第一页的上一页也是灰色,所以判断要满足某两个条件才行
  18. # 思路2: 可以通过获取当前网站的总页数来进行数据爬取