基于Python的爬取猫眼电影top100程序解析

7 篇文章 2 订阅
5 篇文章 0 订阅

本文仅供参考,不可转载,有任何问题可联系小编,谢谢!

《Python程序设计》
课程论文

题 目: 爬取猫眼电影top100程序解析

院 系: 基础科学学院信息技术系

2019 年 6 月
目 录

第一章 《Python程序设计》学习体会 3
1.1 课程概述 3
1.2 学习体会 4
第二章 爬取猫眼电影top100程序解析 5
2.1 实例概述 5
2.2 详细实现 6
2.2.1抓取单页内容,并对网址的url进行分析。 6
2.2.2利用Requests获取首页数据 7
2.2.3内容提取解析:利用正则表达式分析 9
2.2.4 数据存储:保存至文件 11
2.2.5 分页爬取:开启循环及多线程 12
2.2.6 下载图片 13
第三章 总结 17
3.1 收获 17
3.2 下一步计划 17

第一章 《Python程序设计》学习体会

1.1 课程概述

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Python具有易学习、易于阅读、易于维护、一个广泛的标准库、可移植性、可扩展性、可嵌入等特点。首先python是面向对象的、解释性计算机程序设计语言,广泛应用于科学计算。也有很多用途:网页开发、可视化界面开发、网络、系统编程、数据分析、机器学习、网络爬虫、科学计算等

1.2 学习体会

自从学习了python之后,从中体会到了在之后的学习过程中要:
1> 有计划的学习和良好的心态。
不是每天都是把时间挤出来学习,更不能三天打鱼两天晒网的;如果遇到学习中有哪些不会的知识点时,就要想办法来解决他,不是一味的放弃。
2> 在学习过程中,能把自己制定的目标分成几个小的目标来实现,就比如说做一个爬虫,需要分几步来完成,这样效率会更高。
3> 多看多练
俗话说得好:好记性不如烂笔头。“练”就是在学习的过程中经常的动手去写代码,即使是抄课本上的源代码。“看”要经常的阅读和学习他人优秀的代码,这样你的python能力才会有很大的提高。

第二章 爬取猫眼电影top100程序解析

2.1 实例概述

爬取猫眼电影top100是利用Requsts以及正则表达式来实现,从网页中提取top100电影的电影名称、封面图片、排名、上映时间、评分、演员等信息,并保存为csv文本文件。然后根据爬取的结构进行简单的可视化分析。
主要的流程框架有:

第一步:利用Requests请求目标站点,得到单个网页的HTML代码,并返回结果。
第二步:根据HTML代码分析利用正则表达式得到电影的名称、主演、上映时间、评分、图片链接等信息。
第三步:讲提取到的信息通过文件的形式将结果保存至csv文本文件,每一部电影一个结构,一行Json字符串
第四步:开启循环及多线程。对多页内容遍历,开启多线程提取的抓取速度。
第五步:将提取的电影的相对应的图片下载下来。

2.2 详细实现

2.2.1抓取单页内容,并对网址的url进行分析。
首先,打开猫眼Top100的url网址: http://maoyan.com/board/4?offset=0。页面非常简单,所包含的信息就是上述所说的爬虫目标。下拉页面到底部,点击第2页可以看到网址变为:http://maoyan.com/board/4?offset=10。因此,可以推断出url的变化规律:offset表示偏移,10代表一个页面的电影偏移数量,即:第一页电影是从0-10,第二页电影是从11-20。因此,获取全部100部电影,只需要构造出10个url,然后依次获取网页内容,再用正则表达式的方法提取出所需内容。

在这里插入图片描述

在这里插入图片描述

2.2.2利用Requests获取首页数据

F12打开chrome的调试工具,从图中可以看出,实际上每一个电影选项都包括在dd标签中。
在这里插入图片描述
为了能把这些影片信息爬取出来,思路:
把每一个dd标签作为一个整体提取为一个列表,然后对列表的每一项(包含每部影片的各项信息)进行解析提取

• 先定义一个获取单个页面的函数:get_one_page(),传入url参数。
• def get_one_page(url):
• #添加异常处理
try:
• headers = {‘UserAgent’: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36’}#获取网页html内容
response = requests.get(url)
• #通过状态码判断是否获取成功,如果不是会出现跳转
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
• def main():
url = ‘http://maoyan.com/board/4?offset=0’
html = get_one_page(url)
print(html)
if name == ‘main’:
main()

爬取结果:

在这里插入图片描述

2.2.3内容提取解析:利用正则表达式分析

可以根据上步爬取的结果进行分析,同样也可以在网页中获得相应的信息
在这里插入图片描述
在这里插入图片描述可以看到每部电影的相关信息都在dd这个节点之中。所以就可以从该节点运用正则进行提取。
第1个要提取的内容是电影的排名。它位于class=”board-index”的i结点内。不需要提取的内容用‘.*?’替代,需要提取的数字排名用()括起来,()黎明的数字表示为(d+)。正则表达式可以写为:

. ?board-index.?>(d+)’

接着,第2个需要提取的是封面图片,图片网址位于img结点的’src’属性中,正则表达式可写为:

’src=”(.?)”.?’

第一个和第二个正则之间的代码不需要的,用’.*?’替代,所以两部分合起来就是;

'

. ?board-index.?>(d+). ?src="(.?)"

同理,可以一次用正则写下主演、上映时间和评分等内容,完整的正则表达式:

. ?boardindex.?>(d+). ?src="(.?)". ?name"><a.?>(. ?).?star">(. ?)

.?releasetime">(. ?)</p.?integer">(. ?).?fraction">(. ?).?’

正则表达式写好以后,可以定义一个页面解析提取方法:parse_one_page(),用来提取内容:
• def parse_one_page(html):
pattern = re.compile(’

. ?board-index.?>(\d+). ?data-src="(.?)". ?name"><a’
'.
?>(. ?).?star">(. ?)

.?releasetime">(. ?)’
'.
?integer">(. ?).?fraction">(. ?).?’, re.S)
items = re.findall(pattern, html)
# print(items)

• #把这些信息进行提取,变成字典的形式,进行格式化

for item in items:
yield {
‘index’: item[0],
‘image’: item[1],
‘title’: item[2],
‘actor’: item[3].strip()[3:],
‘time’: item[4].strip()[5:],
‘score’: item[5] + item[6]
}
• def main():
url = 'https://maoyan.com/board/4?offset=0 ’
html = get_one_page(url)
# print(html)
• #生成器
for item in parse_one_page(html):
print(item)
# write_to_file(item)
运行后的结果:

在这里插入图片描述
2.2.4 数据存储:保存至文件

第3步的结构为字典的格式,可以将数据存储到csv文件

• def write_to_file(content):
with open(‘result.csv’, ‘a’, encoding=‘utf-8’) as f:
f.write(json.dumps(content, ensure_ascii=False) + ‘\n’)
f.close()
• def main():
url = 'https://maoyan.com/board/4?offset=0 ’
html = get_one_page(url)
# print(html)
for item in parse_one_page(html):
# print(item)
write_to_file(item)
程序的运行结果:
在这里插入图片描述

2.2.5 分页爬取:开启循环及多线程

第4步完成了一页电影数据的提取,接下来还需要提取剩下的9页共90部电影的数据。对网页进行遍历,给网址传入一个offset参数即可,为了提高提取的速度,引入了进程池。
程序如下:
• def main(offset):
url = ‘https://maoyan.com/board/4?offset= ’ +str(offset)
html = get_one_page(url)
# print(html)
for item in parse_one_page(html):
print(item)
write_to_file(item)
#引入多进程
• if name == ‘main’:
# for i in range(10):
# main(offset=i*10)
# main()
• #进程池
pool = Pool()
pool. map(main, [i * 10 for i in range(10)])
• Time.sleep(1)
• 程序运行的结果:
在这里插入图片描述
在这里插入图片描述

2.2.6 下载图片

#图片下载
def pic_download(url,title):
r=requests.get(url)
with open(“pics/" +title +".jpg",‘wb’) as f:
f.write(r.content)
def main(offset):
#网页链接
url = 'https://maoyan.com/board/4?offset= ’ + str(offset)
#请求网页,获取html
html = get_one_page(url)
#遍历处理后的html结果
for item in parse_one_page(html):

    pic_download(item['image'],item['title'])
    print(item)
    write_to_file(item)

运行结果:

完整代码:

#爬虫库
import requests
#进程池
from multiprocessing import Pool
#requests异常
from requests.exceptions import RequestException
#正则表达式
import re
#json数据格式库
import json
#延迟函数
import time

#定义一个读取一个url并返回相应信息的函数
def get_one_page(url):
try:
#伪装浏览器
headers = {
“User-Agent”: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36’
}
#读取网页
response = requests.get(url)
#判断是否读取成功
if response.status_code == 200:
#返回读取的内容
return response.text
return None
except RequestException:
return None

#定义一个解析html代码的函数
def parse_one_page(html):
#编写正则表达式
pattern = re.compile(’

. ?board-index.?>(\d+). ?data-src="(.?)". ?name"><a’
'.
?>(. ?).?star">(. ?)

.?releasetime">(. ?)’
'.
?integer">(. ?).?fraction">(. ?).?’, re.S)
#开始查找
items = re.findall(pattern, html)
# print(items)
#遍历查找到的内容
for item in items:
#使用关键字yield 类似于return 返回的是一个生成器对象
yield {
‘index’: item[0],
‘image’: item[1],
‘title’: item[2],
‘actor’: item[3].strip()[3:],
‘time’: item[4].strip()[5:],
‘score’: item[5] + item[6]
}

#将结果写到一个csv文本文件中
def write_to_file(content):
with open(‘result.csv’, ‘a’, encoding=‘utf-8’) as f:
f.write(json.dumps(content, ensure_ascii=False) + ‘\n’)
f.close()
#图片下载
def pic_download(url,title):
r=requests.get(url)
with open(“pics/” +title +".jpg",‘wb’) as f:
f.write(r.content)
#打开需要爬取的所有网页,并进行爬取
def main(offset):
#网页链接
url = 'https://maoyan.com/board/4?offset= ’ + str(offset)
#请求网页,获取html
html = get_one_page(url)
#遍历处理后的html结果
for item in parse_one_page(html):
#下载图片
pic_download(item[‘image’],item[‘title’])
#打印出
print(item)
#写入到文件中
write_to_file(item)

if name == ‘main’:
# for i in range(10):
# main(i*10)
# main()
#引用进程池
pool = Pool()
pool. map(main, [i * 10 for i in range(10)])
#延迟1s,避免反爬机制
time.sleep(1)

运行程序的结果:

第三章 总结
3.1 收获

了解了很多有关编程方面的问题,最重要的是我学会了怎么样利用所学的知识从网上获取自己想要的结果。学会了利用正则表达式这个非常重要的方法。虽然爬虫这个看似简单,但是运用的知识非常的多,很多的数据分析都会用到爬虫来获取相关的数据。比如说可视化分析,如果前期的爬虫获取的数据不充分,显然可视化的效果不会很好。所以任何事情,任何的知识点都不要看轻,每一个知识点只要学习了终究会用到的,只是时间问题。

3.2 下一步计划

平时的学习感觉自己的学习进度缓慢,可能是学习的方法不当,在今后的学习中要改善自己的方法,研究适合自己的学习方法。养好良好的个人习惯,在之后做项目的时候需要把项目的目标列一个清单,并按重要的程度去实践。在今后的学习中要反思自己的不足,并找到可行的 进行改正,只有自己不断的努力发现自己的不足才能使自己更加强大!

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I心暖存人T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值