美文网首页
Python爬虫小练习——正则表达式爬取猫眼电影Top100榜单

Python爬虫小练习——正则表达式爬取猫眼电影Top100榜单

作者: 启源啊啊啊 | 来源:发表于2018-08-03 18:08 被阅读0次

    简介

    目标:利用python爬虫,获取猫眼电影Top100榜单数据(排名、电影名、演员、上映时间及国家、评分),并以CSV格式储存。
    主要内容及爬取思路:
    1.导入所需python库(requests/re/time/csv)、headers等必备信息
    2.以首页为例,获取首页源代码,利用正则表达式提取各类所需要的信息
    3.观察页面URL变化规律,构造链接池
    4.将所获取数据,写入CSV文件储存

    以猫眼电影Top榜单首页为例,提取各类所需信息

    链接地址:https://maoyan.com/board/4?offset=0

    猫眼电影
    右键点击检查,分别找到排名、电影名、主演、上映时间及评分的源代码
    排名源代码
    利用正则表达式,在排名源代码基础上进行更改,构造出可以提取整个页面所有排名信息的表达式。
    rank = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
    输出结果如下
    首页排名

    同样的方法,分别找到其他信息的源代码进行更改
    以下分别为:排名、电影名、演员、上映时间、分数

    rank = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
    name = re.findall('</i>.*?<a href="/films/.*?" title="(.*?)"',res.text,re.S)
    actor = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
    time = re.findall('<p class="releasetime">上映时间:(.*?)</p>',res.text,re.S)
    score1 = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',res.text,re.S)
    

    构造能够获取所有页面的链接表达式

    通过观察,每一分页的链接表达式分别为:
    第一页:https://maoyan.com/board/4?offset=0
    第二页:https://maoyan.com/board/4?offset=10
    第三页:https://maoyan.com/board/4?offset=20
    可以发现规律,每一分页只有在后面的参数发生了变化,所以如果想获取 TOP100 电影,只需要分开请求 10 次,而 10 次的 offset 参数设置为 0,10,20,…,90 即可。
    可使用一个for循环,循环10次即可。为了防止网页对爬虫进行封杀,将休眠时间time定为2秒,阶段代码如下。

    urls = ['https://maoyan.com/board/4?offset={}'.format(str(i))for i in range(0,100,10)]
    for url in urls:
        get_info(url)
        time.sleep(2)
    

    将所获取数据存储进CSV文件

    f = open('D:\PycharmProjects/1.csv','w+')
    writer = csv.writer(f)
    writer.writerow(['XXX','XXX','XXX'])
    

    代码汇总

    将阶段性代码封为函数、

    import requests
    import re
    import time
    import csv
    
    f = open('D:\PycharmProjects/2.csv','w+',encoding='utf-8',newline='')
    writer = csv.writer(f)
    writer.writerow(['rank','name','actor','time','score'])
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
    }
    
    
    def get_info(url):
        res = requests.get(url, headers=headers)
        ranks = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
        names = re.findall('</i>.*?<a href="/films/.*?" title="(.*?)"',res.text,re.S)
        actors = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
        times = re.findall('<p class="releasetime">上映时间:(.*?)</p>',res.text,re.S)
        scores = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',res.text,re.S)
    
        for rank, name, actor, play_time, score in zip(ranks,names,actors,play_times,scores):
            writer.writerow([rank,name,actor.strip(),time,score[0]+score[1]])
    
    if __name__ == '__main__':
        urls = ['http://maoyan.com/board/4?offset={}'.format(str(i)) for i in range(0,100,10)]
        for url in urls:
            get_info(url)
            time.sleep(2)
    

    运行结果

    代码运行结果

    初学正则表达式,如有错误,请多指教!

    相关文章

      网友评论

          本文标题:Python爬虫小练习——正则表达式爬取猫眼电影Top100榜单

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