利用python2.7正则表达式进行豆瓣电影Top250的网络数据采集及MySQL数据库操作
转载请注明出处
利用python2.7正则表达式进行豆瓣电影Top250的网络数据采集
1.任务
采集豆瓣电影名称、链接、评分、导演、演员、年份、国家、评论人数、简评等信息
将以上数据存入MySQL数据库
2.任务解析
requests是很好的网络数据采集模块,配合BeautifulSoup可以解析许多HTML。但个人认为BeautifulSoup返回对象不是字符串,而利用其find及findall总觉得力有未逮,与正则表达式的配合总显得有些冗余,甚至需要将BeautifulSoup返回对象转换成字符串形式与正则表达式配合使用,这里我不再利用BeautifulSoup,而是直接利用requests得到的网络文本配合正则表达式完成本次任务。
利用request得到的网络文本,这里截取一段某部电影的完整的网络文本:
<li>
<div class="item">
<div class="pic">
<em class="">2</em>
<a href="https://movie.douban.com/subject/1295644/">
<img alt="这个杀手不太冷" src="https://img3.doubanio.com/view/movie_poster_cover/ipst/public/p511118051.jpg" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1295644/" class="">
<span class="title">这个杀手不太冷</span>
<span class="title"> / Léon</span>
<span class="other"> / 杀手莱昂 / 终极追杀令(台)</span>
</a> <span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 吕克·贝松 Luc Besson 主演: 让·雷诺 Jean Reno / 娜塔丽·波特曼 ...<br>
1994 / 法国 / 剧情 动作 犯罪
</p> <div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.4</span>
<span property="v:best" content="10.0"></span>
<span>712293人评价</span>
</div> <p class="quote">
<span class="inq">怪蜀黍和小萝莉不得不说的故事。</span>
</p>
</div>
</div>
</div>
</li>
其他部分正则匹配参考代码相关部分
需要说明的是,电影年份中第84部《大闹天空》年份如下:'1961(上集) / 1964(下集) / 1978(全本) / 2004(纪念版)',不能通过数字匹配的方式获取年份,因此需要添加。某些电影没有主演及简评等信息,这里需要查找添加。相关代码见78-90行
3.代码
#!/usr/bin/python
# -*- coding: utf-8 -*- #
# 豆瓣电影top250
import requests,sys,re,MySQLdb,time reload(sys)
sys.setdefaultencoding('utf-8')
print '正在从豆瓣电影Top250抓取数据......'
# --------------------------创建列表用于存放数据-----------------------------#
nameList=[]
linkList=[]
scoreList=[]
directorList=[]
playList=[]
yearList=[]
countryList=[]
commentList=[]
criticList=[]
#---------------------------------爬取模块------------------------------------#
def topMovie():
for page in range(1):
url='https://movie.douban.com/top250?start='+str(page*25)
print '正在爬取第---'+str(page+1)+'---页......'
html=requests.get(url)
html.raise_for_status()
try:
contents=html.text # 返回网页内容,是字符串的形式
# ---------------------------------匹配电影中文名------------------------------------#
name=re.compile(r'<span class="title">(.*)</span>')
names=re.findall(name,contents)
for movieName in names:
if movieName.find('/')==-1:
nameList.append(movieName)
# ---------------------------------匹配电影链接------------------------------------#
link=re.compile(r'a href="(.*)" class=""')
links=re.findall(link,contents)
for movieLink in links:
linkList.append(movieLink)
# ---------------------------------匹配电影评分------------------------------------#
score=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
scores=re.findall(score,contents)
for movieScore in scores:
scoreList.append(movieScore)
# ---------------------------------匹配导演------------------------------------#
director=re.compile(ur'导演: (.*) ')
directors=re.findall(director,contents)
for movieDirector in directors:
directorList.append(movieDirector)
# ---------------------------------匹配主演------------------------------------#
play=re.compile(u'主(.*?)<br>')
plays=re.findall(play,contents)
for moviePlay in plays:
playList.append(moviePlay.strip(ur'演: '))
# ---------------------------------匹配年份------------------------------------#
year=re.compile(r'(\d\d\d\d) / ')
years=re.findall(year,contents)
for movieyear in years:
yearList.append(movieyear)
# ---------------------------------匹配国家------------------------------------#
country=re.compile(ur' / (.*) / ')
countries=re.findall(country,contents)
for movieCountry in countries:
countryList.append(movieCountry)
# ---------------------------------匹配评价人数------------------------------------#
commentor=re.compile(ur'<span>(.*)人评价</span>')
commentors=re.findall(commentor,contents)
for movieCommentor in commentors:
commentList.append(movieCommentor)
# ---------------------------------匹配简评------------------------------------#
critic=re.compile(r'<span class="inq">(.*)</span>')
critics=re.findall(critic,contents)
for movieCritic in critics:
criticList.append(movieCritic) except Exception as e:
print e
print '爬取完毕!'
# ---------------------------------个别部分修改-----------------------------------#
# 需要在第84部《大闹天空》不能通过上面的方法筛选,需要在83后加入加入数据
yearList.insert(83, '1961(上集) / 1964(下集) / 1978(全本) / 2004(纪念版)')
playList.insert(38,'...') # 某些电影没有主演和评论,这里用...代替
playList.insert(233,'...')
criticList.insert(134,'...')
criticList.insert(156,'...')
criticList.insert(176,'...')
criticList.insert(180,'...')
criticList.insert(196,'...')
criticList.insert(230,'...')
criticList.insert(232,'...')
return nameList,linkList,scoreList,directorList,playList,yearList,countryList,commentList,criticList
# ---------------------------------储存到数据库-----------------------------------#
def save_to_MySQL():
print 'MySQL数据库存储中......'
try:
conn = MySQLdb.connect(host="127.0.0.1", user="root", passwd="******", db="test", charset="utf8")
cursor = conn.cursor()
print "数据库连接成功"
cursor.execute('Drop table if EXISTS MovieTop250') # 如果表存在就删除
time.sleep(3)
cursor.execute('''create table if not EXISTS MovieTop250(
编号 int not NULL auto_increment PRIMARY KEY ,
电影名称 VARCHAR (200),
链接 VARCHAR (200),
导演 VARCHAR (200),
主演 VARCHAR (200),
年份 VARCHAR (200),
国家 VARCHAR (200),
评价人数 VARCHAR (200),
简评 VARCHAR (200),
评分 VARCHAR (20))''')
for i in range(250):
sql='insert into MovieTop250(电影名称,链接,导演,主演,年份,国家,评价人数,简评,评分)' \
' VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)'
param=(nameList[i],linkList[i],directorList[i],playList[i],yearList[i],
countryList[i],commentList[i],criticList[i],scoreList[i])
cursor.execute(sql,param)
conn.commit()
cursor.close()
conn.close()
except Exception as e:
print e
print 'MySQL数据库存储结束!' # -------------------------------------主模块--------------------------------------#
if __name__=="__main__": # 相当于c语言中的main()函数
try:
topMovie()
save_to_MySQL()
except Exception as e:
print e
4.结果

欢迎大家与我交流,一起学习和探讨。
利用python2.7正则表达式进行豆瓣电影Top250的网络数据采集及MySQL数据库操作的更多相关文章
- python2.7抓取豆瓣电影top250
利用python2.7抓取豆瓣电影top250 1.任务说明 抓取top100电影名称 依次打印输出 2.网页解析 要进行网络爬虫,利用工具(如浏览器)查看网页HTML文件的相关内容是很有必要,我使用 ...
- python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库
python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...
- 利用AJAX JAVA 通过Echarts实现豆瓣电影TOP250的数据可视化
mysql表的结构 数据(数据是通过爬虫得来的,本篇文章不介绍怎么爬取数据,只介绍将数据库中的数据可视化): 下面就是写代码了: 首先看一下项目目录: 数据库层 业务逻辑层 pac ...
- 利用selenium爬取豆瓣电影Top250
这几天在学习selenium,顺便用selenium + python写了一个比较简陋的爬虫,现附上源码,有时间再补充补充: from selenium import webdriver from s ...
- Python爬虫----抓取豆瓣电影Top250
有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...
- urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250
对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- Scrapy爬虫(4)爬取豆瓣电影Top250图片
在用Python的urllib和BeautifulSoup写过了很多爬虫之后,本人决定尝试著名的Python爬虫框架--Scrapy. 本次分享将详细讲述如何利用Scrapy来下载豆瓣电影To ...
随机推荐
- Android 高级UI设计笔记16:ViewStub的应用
1. ViewStub 在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局. 那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为 ...
- PHP面向对象(一)
一.类和对象 1.什么是类:类(class)是对一类事物的描述,是抽象.概念上的定义.是具有某些相同属性和功能行为的一些对象集合. 在面向对象的编程中,类是应该有一个类名并包括属性书名和功能说明两个主 ...
- android 中对于采用okhttp时获取cookie并放入webview实现跳过登陆显示页面的功能
最近项目需要将网页的一些信息展示到app当中,由于采用的是okhttp进行网络的访问,并采用了cookie对于每次的访问请求都做了验证,所以在加入webview显示网页的时候会需要进行一下验证,为了跳 ...
- c#几个小例子引发的思考
楚广明老师的c#教程每一节都会给出几个小例子让大家联系,对于初学者来说这确实是一件很纠结的事情,下面我把这几个小例子简单的写一下.同时看一下我们学到了什么 1.面向过程版的圆周长面积计算 using ...
- js将人民币金额转换为大写
function upDigit(n) { var fraction = ['角', '分']; var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒' ...
- 【VMware虚拟化解决方案】 基于VMware虚拟化平台VDI整体性能分析与优化
一.说一说 本来打算将前期项目里面出现的问题的分析思路与解决方法写出来,第一.疏导一下自己的思路,第二.分析并找出自身在技术层面所存在欠缺.但由于每个人都有一根懒经所以迟迟未动.今天突然发现51CTO ...
- JQuery内容从左边框移到右边框
最近感觉学习挺紧的.JQuery没有学几天就又开始学习AngularJS了.学习的时候都是看着老师用着很简单,自己写的时候就觉得不太会用.但是学习AngularJS的时候有很多问题,我觉得不管是学习J ...
- Android处理Bitmap使其能够不失真等比缩放裁剪后显示在ImageView上
Android开发过程中,我们有时需要动态得显示一些图片,并且这些图片的大小差距会十分大,如果需求并不是需要图片完整显示,但是需要不失真,并且要图片中间部分的情况下,我们需要做一系列处理,因为这个时候 ...
- 十、Notepad++正则表达式使用
推荐个正则表达式在线测试的工具http://ccmpp.com/Regex/ Notepad++正则表达式使用 2011-01-06 10:01:35| 分类: 文档 | 标签:正则表达式 替换 no ...
- 【Unity3D】刚体与碰撞体以及is Trigger属性的意义
[Unity3D]刚体与碰撞体以及is Trigger属性的意义 刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚 ...