Scrapy 通过登录的方式爬取豆瓣影评数据

Scrapy 通过登录的方式爬取豆瓣影评数据

由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现。scrapy工具使用起来比较简单,主要分为以下几步:

1、创建一个项目 ==scrapy startproject Douban

  • 得到一个项目目录如下:

    ├── Douban
    │   ├── init.py
    │   ├── items.py
    │   ├── pipelines.py
    │   ├── settings.py
    │   └── spiders
    │   └── init.py
    └── scrapy.cfg

    2 directories, 6 files

  • 然后定义一个Item
    定义Item项,主要是为了方便得到爬取得内容。(根据个人需要定义吧,不定义也可以。)

  • 定义一个爬虫类
    由上面的目录上,知道放在spider下面。可以根据不同的需要继承 scrapy.Spider 或者是CrawlSpider。然后定义url以及parse方法
    当然也可以使用命令来生成模板scrapy genspider douban douban.com

  • 抓取内容
    使用命令 scrapy crawl spidername

具体可以参照Scrapy手册(scrapy tutorial)

通过scrapy 参考手册的程序定义之后,会发现在爬不到数据,这是因为豆瓣使用了反爬虫机制。我们可以在setting.py内启动DOWNLOAD_DELAY=3 以及User-Agent代理:USER_AGENT = 'Douban (+http://www.douban.com)'

这样就可以开启爬虫了。
但是在爬取豆瓣影评数据的时候,会发现,最多只能爬取10页,然后豆瓣就需要你登录。不然就只能爬取10页数据(从浏览去看,也是只能看到10页数据)。

这就需要我们登录之后再去爬取数据了。
然后在Scrapy手册的Spider部分,发现了可以使用如下方式实现登录:

  1. class MySpider(scrapy.Spider): 
  2. name = 'myspider' 
  3.  
  4. def start_requests(self): 
  5. return [scrapy.FormRequest("http://www.example.com/login"
  6. formdata={'user': 'john', 'pass': 'secret'}, 
  7. callback=self.logged_in)] 
  8.  
  9. def logged_in(self, response): 
  10. # here you would extract links to follow and return Requests for 
  11. # each of them, with another callback 
  12. pass 

通过上面的方法,就可以实现登录豆瓣爬取想要的数据了。

** 本篇笔记初略的记录了如何登录豆瓣爬取数据。


下面试自己写的spider/Doubanspider.py的代码,仅供参考:

  1. # -*- coding: utf-8 -*- 
  2.  
  3. import scrapy 
  4. from scrapy.selector import Selector 
  5. from Douban.items import DoubanItem 
  6.  
  7. class Doubanspider(scrapy.Spider): 
  8. # 定义爬虫的名字 
  9. name = "doubanmovie" 
  10. allowed_domains = ["douban.com"
  11.  
  12. # 初始化url 
  13. # start_urls = ( 
  14. # 'https://movie.douban.com/subject/26266072/comments', 
  15. # ) 
  16.  
  17. def start_requests(self): 
  18. # print u'开始' 
  19. return [scrapy.FormRequest('https://www.douban.com/login'
  20. formdata={'form_email': 'your username', 'form_password': 'your password'}, callback = self.logged_in)] 
  21.  
  22. def logged_in(self, response): 
  23. # 登陆完成之后开始爬取数据 
  24. # print u'成功?' 
  25. yield Request('https://movie.douban.com/subject/26266072/comments', callback = self.parse) 
  26.  
  27. # 定义解析的方法 
  28. def parse(self, response): 
  29. # print u'爬取' 
  30. sel = Selector(response) 
  31. self.log("Hi, this is an item page! %s" % response.url) 
  32. item = DoubanItem() 
  33.  
  34. # 每条短评的xpath 
  35. item['comment'] = sel.xpath('//div[@class = "comment"]/p[@class = ""]/text()[1]').extract() 
  36. # 每个评分的xpath 
  37. item['grade'] = sel.xpath('//div[@class = "comment"]/h3/span[@class = "comment-info"]/span[contains(@class,"allstar")]/@title').extract() 
  38.  
  39. yield item 
  40.  
  41. # 下一页的xpath, 如有,则又发出新的请求 
  42. next_page = '//div[@id = "paginator"]/a[@class="next"]/@href' 
  43.  
  44. if response.xpath(next_page): 
  45. url_nextpage = 'https://movie.douban.com/subject/26266072/comments' + response.xpath(next_page).extract()[0
  46. request = Request(url_nextpage, callback = self.parse) 
  47. yield request 
  48.  

items.py的定义如下:

  1. import scrapy 
  2.  
  3. class DoubanItem(scrapy.Item): 
  4. # define the fields for your item here like: 
  5. # name = scrapy.Field() 
  6. comment = scrapy.Field() 
  7. grade = scrapy.Field() 
  8.  

再在setting里面设置好,就可以爬取数据了!


2016.8.30
Fly

原文地址:https://www.cnblogs.com/flyu6/p/5821481.html