利用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 ...
随机推荐
- [WinForm] VS2010的程序打包封装
因为学习的要求,我需要把自己的程序进行打包封装,开始也是苦恼,没有找到很好的办法,但并没有放弃,终于发现了一个差不多的文章,于是摸索着进行,可喜的是是成功了,下面和大家分享一下. 第一步:前提是你已经 ...
- iOS之GCD的DEMO
由DEMO得知,串行队列同步执行会按照顺序一步一步执行,不会开辟线程 由DEMO得知,串行队列异步执行,队列中的任务会一步一步按顺序执行,队列外的任务不确定.会开辟线程 由DEMO得知,并行队列同步执 ...
- (转)内网网站发布到外网-nat123动态公网IP动态域名解析
环境描述: 路由器分配的是动态公网IP,且有路由器登录管理权限,网站服务器部署在路由器内部网络.如何将内网网站发布到外网大众访问? 解决方案: 内网使用nat123动态域名解析,将域名实时固定解析到路 ...
- sublime text 3 扩展插件SideBarEnhancements用法教程
SideBarEnhancements本是增强侧边栏的插件,这里将教大家如何用来做sublime text 3浏览器预览插件,并可自定义浏览器预览的快捷键. 第一步:安装此插件,搜索相关教程,本博客有 ...
- input美化 checkbox和radio样式
input美化 checkbox和radio样式 看惯了input[checkbox]和input[radio]默认样式,有没有想要改变一下呢?比如下面的样式: 比起html默认的样式,上图这些 ...
- c#重载和重写及运用
重载的条件: 1.必须在同一个类中2.方法名必须相同3.参数列表不能相同. 重写的条件: 1. 在不同的类中 2. 发生方法重写的两个方法 ...
- 基于asp.net MVC 的服务器和客户端的交互(三)之客户端请求响应
一.分析 WEB API 中HTTP 请求方式的四个主要方法 (GET, PUT, POST, DELETE), 按照下列方式映射为 CURD 操作: GET 用于获取 URI 资源的进行展示,GET ...
- 给一个Entity的字段付初始化值(C#)
给一个类去分别赋值,是一个很繁琐切无趣的工作. 那我们就想办法给你一个类去初始化,或许不是一个很效率的方法,但是,从可修改的角度讲,却是一个非常不错的方式. 具体的想法就是,利用类的属性,取出所有 ...
- ubuntu将默认中文改成英文
找到/etc/default/locale下面的文件,使用vim打开 将看到内容为: LANG=”zh_CN.UTF-8″ LANGUAGE=”zh_CN:zh” 改为 LANG=”en_US.UTF ...
- JS 回车提交
1.JavaScript 方法: <script> document.onkeydown=function(event){ e = event ? event :(window.event ...