python8--scrapy第一个练习(获取豆瓣电视剧评论)

原创 2017年01月03日 03:22:24

2017年新年快乐O(≧口≦)O!希望自己这一年能比去年更加优秀!赶完论文又出去浪了一圈,直到现在才收心放学习上。就先把之前scrapy第一个小程序整理一下,明天开始新的内容练习(^__^)

这一次还是拿wuli凯凯王的电视剧练手,抓取符合要求的评论生成json文件并将数据存入mysql数据库中。这里是scrapy入门教程,看完之后加以修改,基本可以实现本次任务要求(这个貌似还支持NoSQL,文档中提供了MongoDB的例子,下次可以学学QAQ)。

创建一个项目

首先就是创建一个项目。这里在你需要创建项目的文件夹下,打开亲爱滴cmd(按住Shift键,鼠标右键选择在此处打开命名窗口),输入指令`scrapy startproject projectname,这里projectname就是自己项目名称。如下

创建一个项目

之后用PyCharm打开该项目就可以开始程序编写。

定义Item

在用PyCharm打开项目后,仿照文档教程定义item。这里需要定义几个内容如下:

  • userName:用户名
  • credit:评级( 力荐,推荐,还行,较差,很差)
  • grade:评分(1~5)
  • time:评论时间
  • comment:评论
import scrapy


class Douban2Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    userName = scrapy.Field() #用户名
    credit = scrapy.Field() #评级
    grade = scrapy.Field() #评分
    time = scrapy.Field() #评论时间
    comment = scrapy.Field() #评论

scrapy部分

在scrapy文件夹下创建一个python文档,这就是一个爬虫(Spider)。基本框架仿照文档。

#coding = utf-8
import scrapy
from douban2.items import Douban2Item

#豆瓣评分等级
gradeDic = {
    '力荐':5,
    '推荐':4,
    '还行':3,
    '较差':2,
    '很差':1
}

class DouBan(scrapy.Spider):
    name = 'douban'

    #起始url,一个是正在看部分的评论,一个是看过部分的评论
    start_urls = [
        'https://movie.douban.com/subject/26345137/doings?start=0',
        'https://movie.douban.com/subject/26345137/collections?start=0'
    ]

    def parse(self, response):

        contents = response.xpath('//div[@class="sub_ins"]/table') #获得用户评论区域
        if contents:
            for content in contents:
                #获取用户名
                name = content.xpath('tr/td[2]/div/a/text()').extract()[0].replace(' ', '').replace('\n', '')
                #获取评论时间并格式化
                time = content.xpath('tr/td[2]/p/text()').extract()[0].replace(' ', '').replace('\n', '').replace(
                    '\xa0', '')
                #判断用户是否打分,如果没有直接跳过
                if content.xpath('tr/td[2]/p/span[contains(@class,"allstar")]'):
                    item = Douban2Item()
                    #获取用户评级
                    credit = content.xpath('tr/td[2]/p/span[contains(@class,"allstar")]/@title').extract()[0]
                    item['userName'] = name
                    item['credit'] = credit
                    item['grade'] = gradeDic[credit]
                    item['time'] = time
                    #获取用户评论
                    comment = content.xpath('tr/td[2]/p[2]/text()')
                    if comment:
                        item['comment'] = comment.extract()[0]
                    else:
                        item['comment'] = ''
                    yield item
            #获取下一页url
            nextPage = response.xpath('//span[@class="next"]/a/@href')
            if nextPage:
                url = nextPage.extract()[0]
                print(url)
                yield scrapy.Request(url,self.parse)
        else:
            print("已经是最后一页")

这里主要是内容的提取。这里有一个偷懒的小技巧,就是谷歌浏览器可以获取xpath。如下:
xpath的获取
当然还需要根据自己的需求加以修改,xpath自己也需要加以掌握,但是有时对所求内容表达困惑时,这个可以帮大忙:-O

如果还有下一页,这里获取下一页的url,使用yield让scrapy自动翻页处理后面内容。

数据写入

到此,内容可以成功获取下来了,接下来就是将获取的数据写入json或者数据库中。这里涉及到两个文件,一个pipeline,一个是setting。

  • json文件

这个部分代码网上基本都差不多,直接copy_(:зゝ∠)_

import json
import codecs

class Douban2Pipeline(object):

    def __init__(self):
        self.file = codecs.open('comment.json', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(line + ',')
        return item

    def spider_closed(self, spider):
        self.file.close()
  • mysql

这个部分比较蛋疼。。。在网上看了一大波如何写入MySQL的,其实代码都差不多,但是后来发现那些都是针对python2.x的,使用的包貌似python3.5不能用?后来发现之前用的pymysql这里也是可以使用的(:зゝ∠)

import pymysql

def dbConnent():
#这部分信息需要根据需求调整
    conn = pymysql.connect(
        host='localhost',
        user='root',
        passwd=pwd,
        db='douban',
        charset='utf8',
        use_unicode=False
    )
    return conn

class MySQLPipeline(object):

    def process_item(self,item,spider):
        db = dbConnent()
        cursor = db.cursor()
        sql = 'insert into doing_comment(userName,credit,grade,time,comment) values("%s","%s","%d","%s","%s")'
        values = (item['userName'], item['credit'], item['grade'], item['time'], item['comment'])
        try:
            # 执行sql语句
            cursor.execute(sql % values)
            db.commit()
        except:
            # 发生错误时回滚
            print("出错")
            db.rollback()
        finally:
            # 关闭数据库连接
            # cursor.close()  # 关闭游标
            db.close()
        return item

之后就是setting文件的简单设置

BOT_NAME = 'douban2'

SPIDER_MODULES = ['douban2.spiders']
NEWSPIDER_MODULE = 'douban2.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 1
RANDOMIZE_DOWNLOAD_DELAY = True

# Disable cookies (enabled by default)
COOKIES_ENABLED = False

# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'douban2.pipelines.MySQLPipeline' : 300,
   'douban2.pipelines.Douban2Pipeline': 300,
}

这样项目就完成啦~(≧▽≦)/~

运行

在项目的主目录下(与scrapy.cfg同一目录)创建一个main.py程序,用于运行整个项目。

#coding = utf-8
from scrapy import cmdline

cmdline.execute('scrapy crawl douban'.split())

运行结果

这里是n(≧▽≦)n源代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

【python 自然语言处理】对胡歌【猎场】电视剧评论进行情感值分析

本文基于python3.5编写,如果使用python2.7,只需要修改编码部分和print部分即可。 豆瓣猎场短评爬虫 # encoding: utf-8 ...
  • weixin_38197294
  • weixin_38197294
  • 2017年11月28日 21:34
  • 137

豆瓣影评数据抓取与简要分析

豆瓣影评数据抓取与简要分析
  • patty528
  • patty528
  • 2016年08月17日 11:19
  • 1830

(8)Python爬虫——爬取豆瓣影评数据

利用python爬取豆瓣最受欢迎的影评50条的相关信息,包括标题,作者,影片名,影片详情链接,推荐级,回应数,影评链接,影评,有用数这9项内容,然后将爬取的信息写入Excel表中。具体代码如下:#!/...
  • Fighting_No1
  • Fighting_No1
  • 2016年03月18日 19:30
  • 8302

【python 自然语言处理】对胡歌【猎场】电视剧评论进行情感值分析

主要内容1、什么是SnowNLP? 2、如何进行情绪判断? 3、猎场豆瓣热门短评抓取。 4、猎场热门短评情感分析。什么是SnowNLP? snowNLP,可以分词,标注,还可以进行情绪分析。 Sn...
  • u013421629
  • u013421629
  • 2017年11月20日 16:11
  • 913

Scrapy 爬取 豆瓣电影的短评

之前爬取电影信息的时候,将电影短评的url一并存起来了。 因此爬取电影短评的时候只需将数据库中存在的url 放入start_urls中就好了。spider.py# -*- coding: utf-8...
  • u013402772
  • u013402772
  • 2016年04月15日 10:30
  • 2614

使用requests爬取豆瓣《长城》影评

上一篇文章介绍了使用urllib包爬取《长城》豆瓣影评数据,但是无法爬取所有的数据,只能爬到几百条数据就会被服务器禁止访问。也不知道是什么原因。这里要注意,我是用python3中的urllib.req...
  • chenpe32cp
  • chenpe32cp
  • 2017年01月08日 10:05
  • 613

【分享】8500本豆瓣图书的基本信息、评分和书评

从豆瓣网上爬取的8500本豆瓣图书的基本信息、评分、书评以及书评的留言,贡大家做文本分析 一本书一个txt,txt为豆瓣上图书ID 格式:   书名:挪威的森林 作者:[日]...
  • tianshi_1105
  • tianshi_1105
  • 2013年11月11日 13:53
  • 2148

python爬虫 登陆豆瓣 爬豆瓣电影短评

用python实现登陆豆瓣,并爬取豆瓣电影短评。
  • u013781175
  • u013781175
  • 2016年07月06日 12:07
  • 2255

基于BeautifulSoup爬取豆瓣网上的电影信息

基于BeautifulSoup实现爬取豆瓣网上的电影信息这些天在学习Python,了解到用Python做网页网页爬虫非常的方便,于是琢磨着写了一个简单的爬虫程序(感谢万能的beautifulSoup框...
  • u010104952
  • u010104952
  • 2017年01月03日 21:27
  • 458

pyspider 爬豆瓣电影信息

博客分类: #!/usr/bin/env python  # -*- encoding: utf-8 -*-  # Created on 2015-11-23 10:50...
  • dotedy
  • dotedy
  • 2015年11月27日 15:32
  • 764
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python8--scrapy第一个练习(获取豆瓣电视剧评论)
举报原因:
原因补充:

(最多只允许输入30个字)