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
相关文章推荐
- Oracle中的两种验证方式:操作系统验证和密码文件验证,通过操作系统验证的方式解决客户端登录不了数据的问题
- 通过scrapy,从模拟登录开始爬取知乎的问答数据
- scrapy处理豆瓣登录验证码的三种方式
- Geoserver + postgresql 中通过WFS获取数据时,使用PeropertyName 方式限制列数量,出现多余的列
- C#中通过OLE方式连接informix数据库与查询数据方式
- 通过编程方式在InfoPath 2010表单的下拉框修改事件中获取数据
- domino代理通过Request_Content域接收extjs以post方式提交的数据
- 通过URLConnection发送序列化对象的方式实验分布式系统之间的数据交互
- 通过试验探索Access 2000/XP 数据库的最佳 NTFS 权限设置Microsoft Jet 数据库引擎打不开文件'D:\wwwroot\test\data\'。 它已经被别的用户以独占方式打开,或没有查看数据的权限。
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据
- domino代理通过Request_Content域接收extjs以post方式提交的数据
- FreeBSD添加一个新用户并允许其使用ssh通过公私钥的方式登录
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据
- 通过异步方式发送和接收数据(tcp异步收发数据)
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- 10g使用impdp通过网络方式导入数据
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据
- Android通过Get方式提交数据以及乱码处理
- winform下通过webclient使用非流方式上传(post)数据和文件
- 如何使用SecureCRT6.6.2通过SSH方式登录Ubuntu系统?