Scrapy 通過登錄的方式爬取豆瓣影評數據
由於需要爬取影評數據在來做分析,就選擇了豆瓣影評來抓取數據,工具使用的是Scrapy工具來實現。scrapy工具使用起來比較簡單,主要分為以下幾步:
1、創建一個項目 ==scrapy startproject Douban
-
得到一個項目目錄如下:
├── Douban
│ ├── init.py
│ ├── items.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ └── init.py
└── scrapy.cfg2 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部分,發現了可以使用如下方式實現登錄:
- class MySpider(scrapy.Spider):
- name = 'myspider'
-
- def start_requests(self):
- return [scrapy.FormRequest("http://www.example.com/login",
- formdata={'user': 'john', 'pass': 'secret'},
- callback=self.logged_in)]
-
- def logged_in(self, response):
- # here you would extract links to follow and return Requests for
- # each of them, with another callback
- pass
通過上面的方法,就可以實現登錄豆瓣爬取想要的數據了。
** 本篇筆記初略的記錄了如何登錄豆瓣爬取數據。
下面試自己寫的spider/Doubanspider.py的代碼,僅供參考:
- # -*- coding: utf-8 -*-
-
- import scrapy
- from scrapy.selector import Selector
- from Douban.items import DoubanItem
-
- class Doubanspider(scrapy.Spider):
- # 定義爬蟲的名字
- name = "doubanmovie"
- allowed_domains = ["douban.com"]
-
- # 初始化url
- # start_urls = (
- # 'https://movie.douban.com/subject/26266072/comments',
- # )
-
- def start_requests(self):
- # print u'開始'
- return [scrapy.FormRequest('https://www.douban.com/login',
- formdata={'form_email': 'your username', 'form_password': 'your password'}, callback = self.logged_in)]
-
- def logged_in(self, response):
- # 登陸完成之后開始爬取數據
- # print u'成功?'
- yield Request('https://movie.douban.com/subject/26266072/comments', callback = self.parse)
-
- # 定義解析的方法
- def parse(self, response):
- # print u'爬取'
- sel = Selector(response)
- self.log("Hi, this is an item page! %s" % response.url)
- item = DoubanItem()
-
- # 每條短評的xpath
- item['comment'] = sel.xpath('//div[@class = "comment"]/p[@class = ""]/text()[1]').extract()
- # 每個評分的xpath
- item['grade'] = sel.xpath('//div[@class = "comment"]/h3/span[@class = "comment-info"]/span[contains(@class,"allstar")]/@title').extract()
-
- yield item
-
- # 下一頁的xpath, 如有,則又發出新的請求
- next_page = '//div[@id = "paginator"]/a[@class="next"]/@href'
-
- if response.xpath(next_page):
- url_nextpage = 'https://movie.douban.com/subject/26266072/comments' + response.xpath(next_page).extract()[0]
- request = Request(url_nextpage, callback = self.parse)
- yield request
-
items.py的定義如下:
- import scrapy
-
- class DoubanItem(scrapy.Item):
- # define the fields for your item here like:
- # name = scrapy.Field()
- comment = scrapy.Field()
- grade = scrapy.Field()
-
再在setting里面設置好,就可以爬取數據了!
2016.8.30
Fly
