代码解析及功能分析
代码解析
让程序按照程序员的意图来顺序执行函数
def main(a):
print("hello", a)
if __name__ == "__main__": # 当程序执行时,调用该函数
# 调用函数
main()
准备合适的包
from bs4 import BeautifulSoup # 网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request, urllib.error # 制定URL,获取网页数据
import xlwt # 进行Excel操作
import sqlite3 # 进行SQLite数据库操作
构建爬取步骤
def main():
baseurl = "https://movie.douban.com/top250"
# 1. 爬取网页
# 2. 解析数据
# 3. 保存数据
功能分析
整体功能设计
from bs4 import BeautifulSoup # 网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request, urllib.error # 制定URL,获取网页数据
import xlwt # 进行Excel操作
import sqlite3 # 进行SQLite数据库操作
def main():
baseurl = "https://movie.douban.com/top250?start="
# 1. 爬取网页
datalist = getData(baseurl)
# 2. 逐一解析数据
# 3. 保存数据
savepath = r".\\豆瓣电影top250.xls"
# 爬取网页
def getData(baseurl):
datalist = []
# 2. 逐一解析数据
return datalist
# 3. 保存数据
def saveData(savepath):
pass
if __name__ == "__main__": # 当程序执行时,调用该函数
# 调用函数
main()
urllib
库讲解
已经与urlib2合并
技能增强
from bs4 import BeautifulSoup # 网页解析,获取数据
import re
# 影片超链接的匹配规则
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式,表示规则(字符串模式)
html = """
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="https://movie.douban.com/subject/1292052/">
<img width="100" alt="肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="https://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>
</a>
<span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...
<br>
1994 / 美国 / 犯罪 剧情
</p>
<div class="star">
<span class="rating5-t"></span>
<span class="rating_num" property="v:average">9.7</span>
<span property="v:best" content="10.0"></span>
<span>2405771人评价</span>
</div>
<p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
</li>
"""
soup = BeautifulSoup(html, 'html.parser')
q = str(soup.find_all("div", class_="item"))
link = re.findall(findLink, q)[0]
print(link)
如何为notebook添加行号
view —>Toggle Line Numbers(Shift + L)
如何快速整理HTML5缩进
- 使用折叠代码功能,手动删除字符,容易出错
- 借助网站
- 将H5转换为非字符串格式,三引号囊括内容,然后再
str()
转换为字符串
异常处理
###1722
['https://movie.douban.com/subject/1292052/', 'https://movie.douban.com/subject/1292052/', '肖', ' ', '9.7', '希', '导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins ... 1994\xa0\xa0美国\xa0\xa0犯罪 剧情\n <p>\n<div class="star">\n<span class="rating5-t"><span>\n<span class="rating_num" property="v:average">9.7<span>\n<span content="10.0" property="v:best"><span>\n<span>2405794人评价<span>\n<div>\n<p class="quote">\n<span class="inq">希望让人自由。<span>']
逐段检查输出,发现是前面图片链接未能正确匹配,导致数据错位
if len(inq) != 0:
list1 = list(inq)[0:-1]
str1 = ",".join(list1)
str2 = str1.replace(',', '')
data.append(str2) # 添加概述
重写匹配规则:
1. 首先将对象转换为列表,倒序匹配
2. 再将其转换为字符串,并且剔除多余的空格
预期结果
[['https://movie.douban.com/subject/1292052/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', '肖申克的救赎', '\xa0\xa0The Shawshank Redemption', '9.7', '2405948', '希望让人自由', '导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins ... 1994\xa0 \xa0美国\xa0 \xa0犯罪 剧情'],
['https://movie.douban.com/subject/1291546/', 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg', '霸王别姬', ' ', '9.6', '1790730', '风华绝代', '导演: 陈凯歌 Kaige Chen\xa0\xa0\xa0主演: 张国荣 Leslie Cheung 张丰毅 Fengyi Zha... 1993\xa0 \xa0中国大陆 中国香港\xa0 \xa0剧情 爱情 同性'],
['https://movie.douban.com/subject/1292720/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2372307693.jpg', '阿甘正传', '\xa0\xa0Forrest Gump', '9.5', '1811089', '一部美国近现代史', '导演: 罗伯特·泽米吉斯 Robert Zemeckis\xa0\xa0\xa0主演: 汤姆·汉克斯 Tom Hanks ... 1994\xa0 \xa0美国\xa0 \xa0剧情 爱情'],
['https://movie.douban.com/subject/1295644/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg', '这个杀手不太冷', '\xa0\xa0Léon', '9.4', '1979764', '怪蜀黍和小萝莉不得不说的故事', '导演: 吕克·贝松 Luc Besson\xa0\xa0\xa0主演: 让·雷诺 Jean Reno 娜塔莉·波特曼 ... 1994\xa0 \xa0法国 美国\xa0 \xa0剧情 动作 犯罪'],
['https://movie.douban.com/subject/1292722/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p457760035.jpg', '泰坦尼克号', '\xa0\xa0Titanic', '9.4', '1772310', '失去的才是永恒的。', '导演: 詹姆斯·卡梅隆 James Cameron\xa0\xa0\xa0主演: 莱昂纳多·迪卡普里奥 Leonardo... 1997\xa0 \xa0美国 墨西哥 澳大利亚 加拿大\xa0 \xa0剧情 爱情 灾难'],
['https://movie.douban.com/subject/1292063/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2578474613.jpg', '美丽人生', '\xa0\xa0La vita è bella', '9.6', '1111245', '最美的谎言', '导演: 罗伯托·贝尼尼 Roberto Benigni\xa0\xa0\xa0主演: 罗伯托·贝尼尼 Roberto Beni... 1997\xa0 \xa0意大利\xa0 \xa0剧情 喜剧 爱情 战争'],
['https://movie.douban.com/subject/1291561/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg', '千与千寻', '\xa0\xa0千と千尋の神隠し', '9.4', '1889109', '最好的宫崎骏,最好的久石让。', '导演: 宫崎骏 Hayao Miyazaki\xa0\xa0\xa0主演: 柊瑠美 Rumi Hîragi 入野自由 Miy... 2001\xa0 \xa0日本\xa0 \xa0剧情 动画 奇幻'],
['https://movie.douban.com/subject/1295124/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p492406163.jpg', '辛德勒的名单', "\xa0\xa0Schindler's List", '9.5', '923780', '拯救一个人,就是拯救整个世界', '导演: 史蒂文·斯皮尔伯格 Steven Spielberg\xa0\xa0\xa0主演: 连姆·尼森 Liam Neeson... 1993\xa0 \xa0美国\xa0 \xa0剧情 历史 战争'],
['https://movie.douban.com/subject/3541415/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2616355133.jpg', '盗梦空间', '\xa0\xa0Inception', '9.3', '1743655', '诺兰给了我们一场无法盗取的梦', '导演: 克里斯托弗·诺兰 Christopher Nolan\xa0\xa0\xa0主演: 莱昂纳多·迪卡普里奥 Le... 2010\xa0 \xa0美国 英国\xa0 \xa0剧情 科幻 悬疑 冒险'],
['https://movie.douban.com/subject/3011091/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p524964039.jpg', '忠犬八公的故事', "\xa0\xa0Hachi: A Dog's Tale", '9.4', '1198781', '永远都不能忘记你所爱的人', '导演: 莱塞·霍尔斯道姆 Lasse Hallström\xa0\xa0\xa0主演: 理查·基尔 Richard Ger... 2009\xa0 \xa0美国 英国\xa0 \xa0剧情'],
['https://movie.douban.com/subject/1889243/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2614988097.jpg', '星际穿越', '\xa0\xa0Interstellar', '9.3', '1417233', '爱是一种力量,让我们超越时空感知它的存在', '导演: 克里斯托弗·诺兰 Christopher Nolan\xa0\xa0\xa0主演: 马修·麦康纳 Matthew Mc... 2014\xa0 \xa0美国 英国 加拿大\xa0 \xa0剧情 科幻 冒险'],
['https://movie.douban.com/subject/1292064/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p479682972.jpg', '楚门的世界', '\xa0\xa0The Truman Show', '9.3', '1336327', '如果再也不能见到你,祝你早安,午安,晚安', '导演: 彼得·威尔 Peter Weir\xa0\xa0\xa0主演: 金·凯瑞 Jim Carrey 劳拉·琳妮 Lau... 1998\xa0 \xa0美国\xa0 \xa0剧情 科幻'],
['https://movie.douban.com/subject/1292001/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2574551676.jpg', '海上钢琴师', "\xa0\xa0La leggenda del pianista sull'oceano", '9.3', '1416916', '每个人都要走一条自己坚定了的路,就算是粉身碎骨。', '导演: 朱塞佩·托纳多雷 Giuseppe Tornatore\xa0\xa0\xa0主演: 蒂姆·罗斯 Tim Roth ... 1998\xa0 \xa0意大利\xa0 \xa0剧情 音乐'],
['https://movie.douban.com/subject/3793023/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p579729551.jpg', '三傻大闹宝莱坞', '\xa0\xa03 Idiots', '9.2', '1590469', '英俊版憨豆,高情商版谢耳朵', '导演: 拉库马·希拉尼 Rajkumar Hirani\xa0\xa0\xa0主演: 阿米尔·汗 Aamir Khan 卡... 2009\xa0 \xa0印度\xa0 \xa0剧情 喜剧 爱情 歌舞'],
['https://movie.douban.com/subject/2131459/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p1461851991.jpg', '机器人总动员', '\xa0\xa0WALL·E', '9.3', '1118935', '小瓦力,大人生', '导演: 安德鲁·斯坦顿 Andrew Stanton\xa0\xa0\xa0主演: 本·贝尔特 Ben Burtt 艾丽... 2008\xa0 \xa0美国\xa0 \xa0科幻 动画 冒险'],
['https://movie.douban.com/subject/1291549/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p1910824951.jpg', '放牛班的春天', '\xa0\xa0Les choristes', '9.3', '1103983', '天籁一般的童声,是最接近上帝的存在。', '导演: 克里斯托夫·巴拉蒂 Christophe Barratier\xa0\xa0\xa0主演: 热拉尔·朱尼奥 Gé... 2004\xa0 \xa0法国 瑞士 德国\xa0 \xa0剧情 喜剧 音乐'],
['https://movie.douban.com/subject/1307914/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2564556863.jpg', '无间道', '\xa0\xa0無間道', '9.3', '1082188', '香港电影史上永不过时的杰作', '导演: 刘伟强 麦兆辉\xa0\xa0\xa0主演: 刘德华 梁朝伟 黄秋生 2002\xa0 \xa0中国香港\xa0 \xa0剧情 犯罪 惊悚'],
['https://movie.douban.com/subject/25662329/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2614500649.jpg', '疯狂动物城', '\xa0\xa0Zootopia', '9.2', '1566632', '迪士尼给我们营造的乌托邦就是这样,永远善良勇敢,永远出乎意料', '导演: 拜伦·霍华德 Byron Howard 瑞奇·摩尔 Rich Moore\xa0\xa0\xa0主演: 金妮弗·... 2016\xa0 \xa0美国\xa0 \xa0喜剧 动画 冒险'],
['https://movie.douban.com/subject/1292213/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2455050536.jpg', '大话西游之大圣娶亲', '\xa0\xa0西遊記大結局之仙履奇緣', '9.2', '1290325', '一生所爱', '导演: 刘镇伟 Jeffrey Lau\xa0\xa0\xa0主演: 周星驰 Stephen Chow 吴孟达 Man Tat Ng... 1995\xa0 \xa0中国香港 中国大陆\xa0 \xa0喜剧 爱情 奇幻 古装'],
['https://movie.douban.com/subject/5912992/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p1363250216.jpg', '熔炉', '\xa0\xa0도가니', '9.3', '782576', '我们一路奋战不是为了改变世界,而是为了不让世界改变我们', '导演: 黄东赫 Dong-hyuk Hwang\xa0\xa0\xa0主演: 孔侑 Yoo Gong 郑有美 Yu-mi Jung ... 2011\xa0 \xa0韩国\xa0 \xa0剧情'],
['https://movie.douban.com/subject/1291841/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p616779645.jpg', '教父', '\xa0\xa0The Godfather', '9.3', '785860', '千万不要记恨你的对手,这样会让你失去理智', '导演: 弗朗西斯·福特·科波拉 Francis Ford Coppola\xa0\xa0\xa0主演: 马龙·白兰度 M... 1972\xa0 \xa0美国\xa0 \xa0剧情 犯罪'],
['https://movie.douban.com/subject/1849031/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2614359276.jpg', '当幸福来敲门', '\xa0\xa0The Pursuit of Happyness', '9.1', '1279474', '平民励志片。', '导演: 加布里尔·穆奇诺 Gabriele Muccino\xa0\xa0\xa0主演: 威尔·史密斯 Will Smith ... 2006\xa0 \xa0美国\xa0 \xa0剧情 传记 家庭'],
['https://movie.douban.com/subject/1291560/', 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2540924496.jpg', '龙猫', '\xa0\xa0となりのトトロ', '9.2', '1068704', '人人心中都有个龙猫,童年就永远不会消失', '导演: 宫崎骏 Hayao Miyazaki\xa0\xa0\xa0主演: 日高法子 Noriko Hidaka 坂本千夏 Ch... 1988\xa0 \xa0日本\xa0 \xa0动画 奇幻 冒险'],
['https://movie.douban.com/subject/3319755/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p501177648.jpg', '怦然心动', '\xa0\xa0Flipped', '9.1', '1520804', '真正的幸福是来自内心深处', '导演: 罗伯·莱纳 Rob Reiner\xa0\xa0\xa0主演: 玛德琳·卡罗尔 Madeline Carroll 卡... 2010\xa0 \xa0美国\xa0 \xa0剧情 喜剧 爱情'],
['https://movie.douban.com/subject/1296141/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p1505392928.jpg', '控方证人', '\xa0\xa0Witness for the Prosecution', '9.6', '383096', '比利·怀德满分作品', '导演: 比利·怀尔德 Billy Wilder\xa0\xa0\xa0主演: 泰隆·鲍华 Tyrone Power 玛琳·... 1957\xa0 \xa0美国\xa0 \xa0剧情 犯罪 悬疑']]
保存数据为excel[25.1902]
解决列表超出范围的问题,即下文第二行
# 处理电影的概述
# inq = re.findall(findInq, item)[0] # 去掉句号
inq = re.findall(findInq, item) # 去掉句号
if len(inq) != 0:
list1 = list(inq[0])[0:-1] # inq新增索引:inq[0]
str1 = ",".join(list1)
str2 = str1.replace(',', '')
data.append(str2) # 添加概述
else:
data.append(" ") # 留空
连接SQLite3准备插入数据时的效果
insert into movie250 (
info_link,pic_link,cname,ename,score,rated,introduction,info)
values ("https://movie.douban.com/subject/26393561/","https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2510956726.jpg","小萝莉的猴神大叔"," Bajrangi Bhaijaan","8.4","418323","宝莱坞的萝莉与大叔","导演: 卡比尔·汗 Kabir Khan 主演: 萨尔曼·汗 Salman Khan 哈莎莉·马... 2015 印度 剧情 喜剧 动作")
如何消除空格
数据比较
"肖申克的救赎"
" The Shawshank Redemption"
"希望让人自由"
"导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins ... 1994 美国 犯罪 剧情"
insert into movie250 (
info_link,pic_link,cname,ename,score,rated,introduction,info)
values ("https://movie.douban.com/subject/1292052/","https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg","肖申克的救赎"," The Shawshank Redemption",9.7,2406052,"希望让人自由","导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins ... 1994 美国 犯罪 剧情")
SQLite中的数据
1,https://movie.douban.com/subject/1292052/,https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg,肖申克的救赎, The Shawshank Redemption,9.7,2406052,希望让人自由,导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins ... 1994 美国 犯罪 剧情
观察可以知道,在英文名前面有空格,电影概述中有空格,因此分别对两部分内容进行去空格处理
### 删除英文名之中的空格
# 处理电影的标题
titles = re.findall(findTitle, item) # 片名只有一个中文名,没有外文名
# data.append(titles)
if(len(titles) == 2):
ctitle = titles[0]
data.append(ctitle) # 添加中文名
otitle = titles[1].replace("/", "") # 去掉无关的符号
otitle = otitle.strip() # <修改之处>
data.append(otitle) # 添加外文名
### 删除电影简介中的空格
bd = re.findall(findBd, item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd) # 去掉<br/>
bd = re.sub('/', " ", bd) # 替换/
bd = re.sub('\xa0',"",bd) # 去掉无关字符<x>
data.append(bd.strip()) # 去掉前后的空格