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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM