榜单规则: 将昨日国内热映的影片,按照评分从高到低排列取前10名,每天上午10点更新。相关数据来源于“猫眼专业版”及“猫眼电影库”。
网页地址: https://maoyan.com/board/7
获取的内容: 排名,片名,主演,上映时间,评分
分别通过四种方法获取到数据
一、运用正则表达式
二、运用BeautifulSoup-find_all
三、运用BeautifulSoup-select
四、运用lxml
一、运用正则表达式
1、分析网页
需要获取的内容全部在<dd> ...</dd>
这个标签中,获取里面的全部内容即可
2、请求网页源码
导入requests,制作请求头,网页通过get方法请求的
import requests
url = 'https://maoyan.com/board/7'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
res = requests.get(url=url,headers=headers)
html = res.text.replace(" ","")
print (html)
输出的部分网页源码:
<dd>
<iclass="board-indexboard-index-1">1</i>
<ahref="/films/1211270"title="哪吒之魔童降世"class="image-link"data-act="boarditem-click"data-val="{movieId:1211270}">
<imgsrc="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png"alt=""class="poster-default"/>
<imgdata-src="https://p0.meituan.net/movie/005955214d5b3e50c910d7a511b0cb571445301.jpg@160w_220h_1e_1c"alt="哪吒之魔童降世"class="board-img"/>
</a>
<divclass="board-item-main">
<divclass="board-item-content">
<divclass="movie-item-info">
<pclass="name"><ahref="/films/1211270"title="哪吒之魔童降世"data-act="boarditem-click"data-val="{movieId:1211270}">哪吒之魔童降世</a></p>
<pclass="star">
主演:吕艳婷,囧森瑟夫,瀚墨
</p>
<pclass="releasetime">上映时间:2019-07-26</p></div>
<divclass="movie-item-numberscore-num">
<pclass="score"><iclass="integer">9.</i><iclass="fraction">7</i></p>
</div>
</div>
</div>
</dd>
3、正则解析源码
3.1、把其中一个<dd> ...</dd>
模块复制到re.compile(’ ')
3.2、使用“ .*? ”代替每个dd标签不同地方,使用“(. *?)”代替要获取的内容
r = re.compile('<dd>\n<iclass=".*?">(.*?)</i>\n.*?"class="image-link"data-act="boarditem-click"data-val=".*?">\n<imgsrc=".*?"alt=""class=".*?"/>\n<imgdata-src=".*?"alt=".*?"class="board-img"/>\n</a>\n<divclass="board-item-main">\n<divclass="board-item-content">\n<divclass="movie-item-info">\n<pclass="name"><ahref=".*?"title=".*?"data-act="boarditem-click"data-val=".*?">(.*?)</a></p>\n<pclass="star">\n(.*?)\n</p>\n<pclass="releasetime">(.*?)</p></div>\n<divclass="movie-item-numberscore-num">\n<pclass="score"><iclass="integer">(.*?)</i><iclass="fraction">(.*?)</i></p>\n</div>\n\n</div>\n</div>\n\n</dd>')
re_html = re.findall(r,html)
print (re_html)
输出结果:
[('1', '哪吒之魔童降世', '主演:吕艳婷,囧森瑟夫,瀚墨', '上映时间:2019-07-26', '9.', '7'),
('2', '烈火英雄', '主演:黄晓明,杜江,谭卓', '上映时间:2019-08-01', '9.', '5'),
('3', '银河补习班', '主演:邓超,白宇,任素汐', '上映时间:2019-07-18', '9.', '4'),
('4', '千与千寻', '主演:柊瑠美,周冬雨,入野自由', '上映时间:2019-06-21', '9.', '3'),
('5', '游戏人生零', '主演:松冈祯丞,茅野爱衣,日笠阳子', '上映时间:2019-07-19', '9.', '3'),
('6', '使徒行者2:谍影行动', '主演:张家辉,古天乐,吴镇宇', '上映时间:2019-08-07', '9.', '1'),
('7', '扫毒2天地对决', '主演:刘德华,古天乐,苗侨伟', '上映时间:2019-07-05', '9.', '0'),
('8', '蜘蛛侠:英雄远征', '主演:汤姆·赫兰德,杰克·吉伦哈尔,塞缪尔·杰克逊', '上映时间:2019-06-28', '9.', '0'),
('9', '爱宠大机密2', '主演:帕顿·奥斯瓦尔特,冯绍峰,凯文·哈特', '上映时间:2019-07-05', '9.', '0'),
('10', '狮子王', '主演:唐纳德·格洛弗,塞斯·罗根,詹姆斯·厄尔·琼斯', '上映时间:2019-07-12', '8.', '9')]
4、提取内容
我们解析后得到的内容是数组结构,需要迭代输出里面的内容
注意:
(1)如 主演:吕艳婷,囧森瑟夫,瀚墨
,我们只获取演员的名字,必须去掉主演:
,上映时间也是一样
actor = item[2].strip()[3:] if len(item[2])>3 else ''
#先判断是否大于3个字符,满足就从第3个字符截取到最后一个字符
(2)评分被分为了两个部分,所以完整的评分必须要经过拼接
for item in re_html:
rank = item[0]
title = item[1]
actor = item[2].strip()[3:] if len(item[2])>3 else '' #判断是否大于3个字符
time = item[3].strip()[5:] if len(item[3])>5 else ''
score = item[4] + item[5]
print (rank,title,actor,time,score)
输出结果:
1 哪吒之魔童降世 吕艳婷,囧森瑟夫,瀚墨 2019-07-26 9.7
2 烈火英雄 黄晓明,杜江,谭卓 2019-08-01 9.5
3 银河补习班 邓超,白宇,任素汐 2019-07-18 9.4
4 千与千寻 柊瑠美,周冬雨,入野自由 2019-06-21 9.3
5 游戏人生零 松冈祯丞,茅野爱衣,日笠阳子 2019-07-19 9.3
6 使徒行者2:谍影行动 张家辉,古天乐,吴镇宇 2019-08-07 9.1
7 扫毒2天地对决 刘德华,古天乐,苗侨伟 2019-07-05 9.0
8 蜘蛛侠:英雄远征 汤姆·赫兰德,杰克·吉伦哈尔,塞缪尔·杰克逊 2019-06-28 9.0
9 爱宠大机密2 帕顿·奥斯瓦尔特,冯绍峰,凯文·哈特 2019-07-05 9.0
10 狮子王 唐纳德·格洛弗,塞斯·罗根,詹姆斯·厄尔·琼斯 2019-07-12 8.9
5、数据写入csv
import csv
#创建CSV文件,并写入表头信息
fp = open('G:\maoyanTop10.csv','a',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('排名','片面','主演','上映时间','评分'))
for item in re_html:
rank = item[0]
title = item[1]
actor = item[2].strip()[3:] if len(item[2])>3 else '' #判断是否大于3个字符
time = item[3].strip()[5:] if len(item[3])>5 else ''
score = item[4] + item[5]
# 写入数据
writer.writerow((rank,title,actor,time,score))
运行结果:
如果打开csv乱码,请看python xpath爬取豆瓣图书Top 250存入csv文件并解决csv乱码问题
爬取网页完整python代码如下:
import requests,re,csv
url = 'https://maoyan.com/board/7'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
#创建CSV文件,并写入表头信息
fp = open('G:\maoyanTop10.csv','a',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('排名','片面','主演','上映时间','评分'))
res = requests.get(url=url,headers=headers)#请求网页
html = res.text.replace(" ","")#去掉空格,方便匹配
r = re.compile('<dd>\n<iclass=".*?">(.*?)</i>\n.*?"class="image-link"data-act="boarditem-click"data-val=".*?">\n<imgsrc=".*?"alt=""class=".*?"/>\n<imgdata-src=".*?"alt=".*?"class="board-img"/>\n</a>\n<divclass="board-item-main">\n<divclass="board-item-content">\n<divclass="movie-item-info">\n<pclass="name"><ahref=".*?"title=".*?"data-act="boarditem-click"data-val=".*?">(.*?)</a></p>\n<pclass="star">\n(.*?)\n</p>\n<pclass="releasetime">(.*?)</p></div>\n<divclass="movie-item-numberscore-num">\n<pclass="score"><iclass="integer">(.*?)</i><iclass="fraction">(.*?)</i></p>\n</div>\n\n</div>\n</div>\n\n</dd>')
re_html = re.findall(r,html)
for item in re_html:
rank = item[0]
title = item[1]
actor = item[2].strip()[3:] if len(item[2])>3 else '' #判断是否大于3个字符
time = item[3].strip()[5:] if len(item[3])>5 else ''
score = item[4] + item[5]
print (rank,title,actor,time,score)#打印数据
# 写入数据
writer.writerow((rank,title,actor,time,score))
二、运用BeautifulSoup-find_all
源代码如下:
import requests
from bs4 import BeautifulSoup
url = 'https://maoyan.com/board/7'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
res = requests.get(url=url,headers=headers)
soup = BeautifulSoup(res.text,"html.parser") #树状解析
for tag in soup.find_all('dd'):
rank = tag.find('i').get_text()#获取i标签的文本
name = tag.find_all('p')[0].get_text()#获取第一个p标签的文本
actor = tag.find_all('p')[1].get_text().replace("\n","").replace(" ","")#替换掉换行符和空格符
time = tag.find_all('p')[2].get_text().strip()[5:]#从第五个字符开始截取,去掉“上映时间:”
score = tag.find_all('p')[3].get_text()#评分的两个部分均属于第四个p标签
print (rank,'\t',name,'\t',actor,'\t',time,'\t',score) #打印。‘\t’表示tab键,用来隔离数据
运行结果:
1 哪吒之魔童降世 主演:吕艳婷,囧森瑟夫,瀚墨 2019-07-26 9.7
2 烈火英雄 主演:黄晓明,杜江,谭卓 2019-08-01 9.5
3 银河补习班 主演:邓超,白宇,任素汐 2019-07-18 9.4
4 千与千寻 主演:柊瑠美,周冬雨,入野自由 2019-06-21 9.3
5 游戏人生 零 主演:松冈祯丞,茅野爱衣,日笠阳子 2019-07-19 9.3
6 使徒行者2:谍影行动 主演:张家辉,古天乐,吴镇宇 2019-08-07 9.1
7 扫毒2天地对决 主演:刘德华,古天乐,苗侨伟 2019-07-05 9.0
8 蜘蛛侠:英雄远征 主演:汤姆·赫兰德,杰克·吉伦哈尔,塞缪尔·杰克逊 2019-06-28 9.0
9 爱宠大机密2 主演:帕顿·奥斯瓦尔特,冯绍峰,凯文·哈特 2019-07-05 9.0
10 狮子王 主演:唐纳德·格洛弗,塞斯·罗根,詹姆斯·厄尔·琼斯 2019-07-12 8.9
BeautifulSoup运用实战教程可以参考案例:BeautifulSoup爬取豆瓣电影top250信息
三、运用BeautifulSoup-select
源代码如下:
import requests
from bs4 import BeautifulSoup
url = 'https://maoyan.com/board/7'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
res = requests.get(url=url,headers=headers)
soup = BeautifulSoup(res.text,"html.parser")
# 使用select选择节点
for tag in soup.select('dd'):
rank = tag.select('i')[0].text#获取i标签的文本
name = tag.select('p')[0].text#获取第一个p标签的文本
actor = tag.select('.star')[0].text.replace("\n","").replace(" ","")#替换掉换行符和空格符
time = tag.select('.releasetime')[0].text.strip()[5:]#从第五个字符开始截取,去掉“上映时间:”
score = tag.select('.integer')[0].text + tag.select('.fraction')[0].text #评分的两个部分不能直接通过score获取
print (rank,name,actor,time,score)
运行结果:
四、运用lxml
源代码如下:
import requests
from lxml import etree
url = 'https://maoyan.com/board/7'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
res = requests.get(url=url,headers=headers)
html = etree.HTML(res.text) #etree解析网页
for et in html.xpath('//*[@id="app"]/div/div/div/dl/dd'):
rank =et.xpath('./i/text()')[0] #[0]表示获取数组中的第一值
name = et.xpath('./div/div/div[1]/p[1]/a/text()')[0]
actor = et.xpath('./div/div/div[1]/p[2]/text()')[0].replace("\n","").replace(" ","")
time = et.xpath('./div/div/div[1]/p[3]/text()')[0]
s1 = et.xpath('./div/div/div[2]/p/i[1]/text()')[0]
s2 = et.xpath('./div/div/div[2]/p/i[2]/text()')[0]
score = s1+s2 #字符串拼接
print (rank,name,actor,time,score)
运行结果:
lmxl具体运用实战可以参考案例: python xpath爬取豆瓣图书Top 250