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自己也需要加以掌握,但是有时对所求内容表达困惑时,这个可以帮大忙:-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源代码
- python8--scrapy第一个练习(获取豆瓣电视剧评论)
- keras实现双向循环RNN,豆瓣电视剧评论情感分析
- 数据采集(七):爬取豆瓣电影评论(scrapy+模拟登陆)
- Scrapy练习爬知乎第一辑
- 电视剧古剑奇谭-评论
- 创建第一个scrapy项目
- scrapy的第一个爬虫
- scrapy 抓取豆瓣数据(1)
- scrapy抓取豆瓣数据(2)
- 我的第一个豆瓣短评爬虫
- scrapy爬虫起步(1)--第一个爬虫程序
- Scrapy爬虫(一)——你的第一个Scrapy爬虫
- 第一个练习
- 第一个hadoop练习
- JSP--第一个练习
- 效果图:第一个练习
- 第一个练习
- 第一个页面练习
- 有关SQLite的并发问题。。。(C#)
- j2me中如何让TextField获取焦点
- 看一下这个链接问题!
- 怎么获得程序的安装盘符?
- WTK为何无法播放音乐?
- python8--scrapy第一个练习(获取豆瓣电视剧评论)
- 为什么OnDraw()方法没有被执行!郁闷
- 设置CImageList背景时模拟器死住
- 关于J2ME中获取IMSI,急!!!!!!
- JAVA 报表
- 检测日期及时间
- 为何不能用j2me开发CDC程序?
- 请问一下J2ME的FORM如何清屏
- 开发S60 3rd开机后台运行的程序需要注意些什么?