• 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

  • 相关阅读:
    oracle之rman备份
    oracle数据库经常提示27102 out of memory解决方法
    异构环境oracle数据库迁移dmp文件之exp和imp以及expdp和impdp
    新安装的win7/win10系统,所有驱动都没安装,插入U盘也无法识别解决方法
    oracle使用一条语句批量插入多条数据
    oracle使用flashback时,没有显示undosql
    export的变量另开一个终端失效解决方法
    oracle服务器重启后无法进入系统,登录系统时提示model is unknow
    mysql将某数据库的全部权限赋给某用户,提示1044错误Access denied
    如何取消noarch.rpm包
  • 原文地址:https://www.cnblogs.com/flyu6/p/5821481.html
Copyright © 2020-2023  润新知