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源代码

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

相关文章推荐

数据采集(七):爬取豆瓣电影评论(scrapy+模拟登陆)

目标爬取豆瓣电影上至少10部电影的短评数据。本例中爬取开始的链接是豆瓣电影排行榜,可以看到刚好有10部。点击每个电影的标题会切入电影简介页。这个页面仅包含电影的部分评论。通过访问“全部**条”超链,可...
  • czl389
  • czl389
  • 2017年08月01日 17:54
  • 626

Python爬虫系列之----Scrapy(九)使用CrawlSpider完善豆瓣图书爬虫

接着上一篇文章,剩下的那几个功能未完成,在这片文章中我们通过CrawlSpider来完善它 一、CrawlSpider简介 CrawlSpider是一个比较有用的组件,其通过正则表达匹配对应u...

python爬虫入门笔记:用scrapy爬豆瓣

本文希望达到以下目标: 简要介绍Scarpy使用Scarpy抓取豆瓣电影 我们正式讲scrapy框架爬虫,并用豆瓣来试试手,url:http://movie.douban.com/top250 首...

python 爬虫学习三(Scrapy 实战,豆瓣爬取电影信息)

利用Scrapy爬取豆瓣电影信息主要列出Scrapy的三部分代码: spider.py文件: # _*_ coding=utf-8 _*_ import scrapy from course.do...

Python爬虫系列之----Scrapy(八)爬取豆瓣读书某个tag下的所有书籍并保存到Mysql数据库中去

一、创建项目 scrapy startproject books 二、编写Item 在items.py中编写我们需要的数据模型: import scrapy class ...

分布式视频信息爬虫,抓取豆瓣,bilibili等中的电视剧、电影、动漫演员等信息

分布式视频信息爬虫,从豆瓣,bilibili等收集电视剧、电影、动漫、演员等信息, 使用requests 发送请求,BeatufulSoup解析html,SQLAlchemy 作为ORM,Alem...

Scrapy爬虫笔记【8-Scrapy核心操作+爬豆瓣图片+数据库链接】

本文地址: 博客文章地址 版权所有,违者必究 scrapy startproject  doubanImage 建立工程, pretty easy huh?                ...

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

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

[Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程

爬虫框架Scrapy的第一个爬虫示例入门教程。 我们使用dmoz.org这个网站来作为小抓抓一展身手的对象。 首先先要回答一个问题。 问:把网站装进爬虫里,总共分几步? 答案很简单,四步: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python8--scrapy第一个练习(获取豆瓣电视剧评论)
举报原因:
原因补充:

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