今天呢我们尝试写一个简单的小爬虫爬取猫眼电影的 top 100 榜 的前 40 个电影,顺便列出上映时间、导演等信息,并保存在本地磁盘中以备查看。
其实这次爬取的过程并不是很难(选了一个很友好的网页),主要是练习一下刚学的正则表达式,细节可以参考这篇文章。
我们可以通过 python 内置的 urllib.request.urlopen 方法获取网页源码,我们通过对源码的分析摘取出我们想要的内容。
import urllib
resp = urllib.request.urlopen("https://maoyan.com/board/4?offset=0")
resp.read().decode("utf-8")
得到的结果很多截取了一部分在这里:
'<!DOCTYPE html>\n\n<!--[if IE 8]><html class="ie8"><![endif]-->\n<!--[if IE 9]>
<html class="ie9"><![endif]-->\n<!--[if gt IE 9]><!-->
<html><!--<![endif]-->\n<head>\n
<title>TOP100榜 - 猫眼电影 - 一网打尽好电影</title>\n ...
注意这个网页的编码方式是 utf-8 如果采用默认的方式读取会得到一段乱码。
下面我么就开始正式的爬取,首先是获取数据,因为前四十个电影被放在的不同的页面上,我们观察它们的地址的规律发现只是 https://maoyan.com/board/4?offset=0 中的 offset= 后面的数字有变化,从 0 开始,每增加一页数字增加 10 。
import urllib
def load_data(page = 1):
offset = (page - 1) * 10
url = "https://maoyan.com/board/4?offset=" + str(offset)
resp = urllib.request.urlopen(url)
return resp.read().decode("utf-8")
获取到代码了,接下来就是从这部分的网页源码中找到我们感兴趣的内容,我们分别写一个函数用来获取:电影排名、电影名字、电影相关信息、上映时间、电影得分。
首先我们观察源码,发现我们所感兴趣的所有信息都可以在一个 <dd> 标签内找到:
部分网页源代码
首先我们来获取排名:
观察上面的代码片段,我们发现排名是在一个 <i> 标签内部保存的,就在 </i> 的前面。所以我们可以这样来写:
def load_ranking(html):
reg = '<dd.*?<i.*?>(.*?)</i>'
return re.findall(reg,html,re.S)
再来看一看上映时间是怎么获取的,上映时间也很好定位,前面有一个 <p class="releasetime" > ,有一个问题就是如果直接这样得到的列表会包含很多的空白,所以我们使用 map 函数,以及 str.strip 方法去掉空白。
处理前是类似于这样的:['\n 主演:张国荣,张丰毅,巩俐\n ', '\n ... ]
def load_time(html):
reg = '<dd.*?<div\sclass="board-item-main".*?<p\sclass="releasetime".*?>(.*?)</p>'
rs = re.findall(reg,html,re.S)
return list(map(str.strip,rs))
还有就是导入电影得分的时候可能会遇到一点小问题: 主要就是评分的整数部分与小数部分被保存在了不同的标签里面(<class="integer"> 、<class="fraction">)我们得到结果后需要组合一下,然后合成一个字符串。
def load_score(html):
reg = '<dd.*?<p\sclass="releasetime".*?<i\sclass="integer".*?>(.*?)</i>'
iteger = re.findall(reg,html,re.S)
reg_frag = '<dd.*?<p\sclass="releasetime".*?<i\sclass="fraction".*?>(.*?)</i>'
fraction = re.findall(reg_frag,html,re.S)
score = list(zip(iteger,fraction))
rs = map(lambda x: str(x[0]) + str(x[1]), score)
return list(rs)
其他部分的获取就很容易啦,直接给出源码:
def load_name(html):
reg = '<dd.*?<p\sclass="name".*?><a.*?>(.*?)</a>'
return re.findall(reg,html,re.S)
def load_time(html):
reg = '<dd.*?<div\sclass="board-item-main".*?<p\sclass="releasetime".*?>(.*?)</p>'
rs = re.findall(reg,html,re.S)
return list(map(str.strip,rs))
最后我们将它写入到文件中:
def save_file(html):
records = zip(load_ranking(html),
load_name(html),
load_info(html),
load_time(html),
load_score(html))
infos = list(records)
with open("top.txt",'a+') as f:
for line in infos:
data = "\t".join(line)
print(data)
f.writelines(data)
#换行
f.write("\n")
save_file(html)
我们来看一下我们得到的结果:
操作结束~
看电影去了...
网友评论