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部分,发现了能够使用以下方式实现登陆:
- 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):
-
-
- pass
经过上面的方法,就能够实现登陆豆瓣爬取想要的数据了。
** 本篇笔记初略的记录了如何登陆豆瓣爬取数据。
下面试本身写的spider/Doubanspider.py的代码,仅供参考:
-
-
- import scrapy
- from scrapy.selector import Selector
- from Douban.items import DoubanItem
-
- class Doubanspider(scrapy.Spider):
-
- name = "doubanmovie"
- allowed_domains = ["douban.com"]
-
-
-
-
-
-
- def start_requests(self):
-
- 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):
-
-
- yield Request('https://movie.douban.com/subject/26266072/comments', callback = self.parse)
-
-
- def parse(self, response):
-
- sel = Selector(response)
- self.log("Hi, this is an item page! %s" % response.url)
- item = DoubanItem()
-
-
- item['comment'] = sel.xpath('//div[@class = "comment"]/p[@class = ""]/text()[1]').extract()
-
- item['grade'] = sel.xpath('//div[@class = "comment"]/h3/span[@class = "comment-info"]/span[contains(@class,"allstar")]/@title').extract()
-
- yield item
-
-
- 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):
-
-
- comment = scrapy.Field()
- grade = scrapy.Field()
-
再在setting里面设置好,就能够爬取数据了!
2016.8.30 Fly