Scrapy 经过登陆的方式爬取豆瓣影评数据

Scrapy 经过登陆的方式爬取豆瓣影评数据

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

一、建立一个项目 ==scrapy startproject Doubanpython

  • 获得一个项目目录以下:web

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

    2 directories, 6 filesdom

  • 而后定义一个Item
    定义Item项,主要是为了方便获得爬取得内容。(根据我的须要定义吧,不定义也能够。)scrapy

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

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

具体能够参照Scrapy手册(scrapy tutorial)this

经过scrapy 参考手册的程序定义以后,会发如今爬不到数据,这是由于豆瓣使用了反爬虫机制。咱们能够在setting.py内启动DOWNLOAD_DELAY=3 以及User-Agent代理:USER_AGENT = 'Douban (+http://www.douban.com)'url

这样就能够开启爬虫了。
可是在爬取豆瓣影评数据的时候,会发现,最多只能爬取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

相关文章
相关标签/搜索