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

相關文章
相關標籤/搜索