美文网首页工作生活
第一个爬虫!爬取猫眼电影热榜

第一个爬虫!爬取猫眼电影热榜

作者: Vector_Wan | 来源:发表于2019-06-30 17:44 被阅读0次

今天呢我们尝试写一个简单的小爬虫爬取猫眼电影的 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)

我们来看一下我们得到的结果:


操作结束~

看电影去了...

相关文章

网友评论

    本文标题:第一个爬虫!爬取猫眼电影热榜

    本文链接:https://www.haomeiwen.com/subject/mfybcctx.html