您的位置:首页 > 其它

Scrapy 通过登录的方式爬取豆瓣影评数据

2016-08-30 12:05 411 查看

Scrapy 通过登录的方式爬取豆瓣影评数据

爬虫
Scrapy
豆瓣
Fly

由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是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部分,发现了可以使用如下方式实现登录:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐