关闭

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

标签: python3-5scrapymysql爬虫-豆瓣
32人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:789次
    • 积分:94
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类