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

来源:互联网 发布:cuda 8.0 linux 编辑:程序博客网 时间:2024/06/06 00:14

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 scrapyclass 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-8import scrapyfrom 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 jsonimport codecsclass 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 pymysqldef dbConnent():#这部分信息需要根据需求调整    conn = pymysql.connect(        host='localhost',        user='root',        passwd=pwd,        db='douban',        charset='utf8',        use_unicode=False    )    return connclass 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-agentUSER_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 rulesROBOTSTXT_OBEY = True# See also autothrottle settings and docsDOWNLOAD_DELAY = 1RANDOMIZE_DOWNLOAD_DELAY = True# Disable cookies (enabled by default)COOKIES_ENABLED = False# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = {   'douban2.pipelines.MySQLPipeline' : 300,   'douban2.pipelines.Douban2Pipeline': 300,}

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

运行

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

#coding = utf-8from scrapy import cmdlinecmdline.execute('scrapy crawl douban'.split())

运行结果

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

0 0