Python 分别使用正则表达式,BeautifulSoup-find_all,select,lxml爬取猫眼电影榜单之放映口碑榜TOP10

榜单规则: 将昨日国内热映的影片,按照评分从高到低排列取前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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值