爬虫【5】爬虫猫眼电影100榜单并保存到csv

爬虫【5】爬虫猫眼电影100榜单并保存到csv

爬虫回顾:

网页URL分析

首先我们打开猫眼电影,经到榜单这一页
在这里插入图片描述
我们可以发现它的url是这样的https://maoyan.com/board/4?offset=0
通过分析我们可以知道/board表示榜单,offset表示页数。进入到第二页发现offset变为20,由此可以发现offset的规律

分析网页html并编写正则项

接下来我们右击打开网页源代码,ctrl+a ctrl + c 复制到vscode中打开,右击代码格式化我们就可以得到整整齐齐的
的网页源代码喽!
对网页源代码进行分析发现一个网页的信息是包含在一个<dd></dd>里的

<dd>
    <i class="board-index board-index-3">3</i>
    <a href="/films/4055" title="这个杀手不太冷" class="image-link" data-act="boarditem-click"
        data-val="{movieId:4055}">
        <img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/imag
            alt="" class="poster-default" />
        <img data-src="https://p1.meituan.net/movie/6bea9af4524dfbd0b668eaa7e187c3df767253.jpg@160w_220h_1
            alt="这个杀手不太冷" class="board-img" />
    </a>
    <div class="board-item-main">
        <div class="board-item-content">
            <div class="movie-item-info">
                <p class="name"><a href="/films/4055" title="这个杀手不太冷" data-act="boarditem-click"
                        data-val="{movieId:4055}">这个杀手不太冷</a></p>
                <p class="star">
                    主演:让·雷诺,加里·奥德曼,娜塔莉·波特曼
                </p>
                <p class="releasetime">上映时间:1994-09-14(法国)</p>
            </div>
            <div class="movie-item-number score-num">
                <p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
            </div>
        </div>
    </div>
</dd>

在里面可以发现我们需要的排名,电影名,主演,上映时间
所以我们可以写出我们的正则,这个我写的正则也不是唯一的和我的有一定的差距都可以
'<dd>.*?board-index-(.*?)".*?<img data-src=.*?alt="(.*?)".*?<p class="star">(.*?)</p>.*?"releasetime">(.*?)</p>.*?</dd>'
主要的思路就算把我们要的东西分组出来就ok了

csv文件

将爬取下来的内容保存到csv文件中就ok啦
在这里插入图片描述

代码

废话就不多说了,下面上代码,代码写了注释,应该可以看懂,还是比较简单的

from urllib import request
import re, time, random, csv
from fake_useragent import UserAgent


class MaoyanSpider:
    def __init__(self):
        self.url = 'http://maoyan.com/board/4?offset={}'
        
    def get_url(self, offset):
        """
        获取url
        """
        return self.url.format(offset)

    def get_headers(self):
        """
        获取伪造的User-Agent
        """
        ua = UserAgent()
        return {'User-Agent': ua.random}

    def get_html(self, headers, offset):
        """
        获取html信息
        """
        url = self.get_url(offset)
        print(url)
        res = request.Request(url, headers=headers)
        req = request.urlopen(res)
        html = req.read().decode()
        return html

    def pattern_html(self, html):
        """
        获取正则匹配的内容
        """
        pattern = re.compile(
            '<dd>.*?board-index-(.*?)".*?<img data-src=.*?alt="(.*?)".*?<p class="star">(.*?)</p>.*?"releasetime">(.*?)</p>.*?</dd>',
            re.S)
        return pattern.findall(html)

    def save_csv(self, moives):
        """
        讲内容保存到csv中
        """
        L = []
        with open('mouyan.csv', 'a') as f:
            writer = csv.writer(f)
            for r in moives:
                ranking = r[0].strip()
                name = r[1].strip()
                star = r[2].strip()[3:]
                time = r[3].strip()[5:15]
                L.append((ranking, name, star, time))
                print(ranking, name, time, star)
            # 在for循环外面
            writer.writerows(L)

    # 主运行函数
    def run(self):
        for i in range(1, 11):
            offset = (i - 1) * 10
            headers = self.get_headers()
            html = self.get_html(headers, offset)
            movies = self.pattern_html(html)
            self.save_csv(movies)
            time.sleep(random.randint(9,13))


if __name__ == '__main__':
    maoyan = MaoyanSpider()
    maoyan.run()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值