爬虫学习Day2:正则表达式

任务

【Task2 正则表达式】:(1天)

学习什么是正则表达式并尝试一些正则表达式并进行匹配。

然后结合requests、re两者的内容爬取https://movie.douban.com/top250里的内容

要求抓取名次、影片名称、国家、导演等字段。

获取豆瓣电影 Top 250的URL

手工浏览后,发现十页的URL分别如下:

通过以下代码获得Top 250的url:

    for i in range(10):
        url = 'https://movie.douban.com/top250?start='
        url += str(i * 25)
        text = opoenurl(url)
        print(text)

得到如下URL链接,确认点击后可以得到想要的结果:
https://movie.douban.com/top250?start=0
https://movie.douban.com/top250?start=25
https://movie.douban.com/top250?start=50
https://movie.douban.com/top250?start=75
https://movie.douban.com/top250?start=100
https://movie.douban.com/top250?start=125
https://movie.douban.com/top250?start=150
https://movie.douban.com/top250?start=175
https://movie.douban.com/top250?start=200
https://movie.douban.com/top250?start=225

获取内容,分析结果

使用以下代码,获取结果

def openurl(url):
   user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
   headers = {'User-Agent': user_agent}
   try:
       r = requests.get(url, headers = headers, timeout = 20)
       r.raise_for_status()
       r.encoding = r.apparent_encoding
       return r.text
   except:
       print('无法访问网页' + url)

分别抓取页面,把结果保存到一个变量中,打印出来如下:
返回很多内容,以下抓取了两个电影,省略了其它的内容:

<ol class="grid_view">
        <li>
            <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                            1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                        </p>


                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.6</span>
                                <span property="v:best" content="10.0"></span>
                                <span>1338863人评价</span>
                        </div>

                            <p class="quote">
                                <span class="inq">希望让人自由。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>
        <li>
            <div class="item">
                <div class="pic">
                    <em class="">2</em>
                    <a href="https://movie.douban.com/subject/1291546/">
                        <img width="100" alt="霸王别姬" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1910813120.jpg" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1291546/" class="">
                            <span class="title">霸王别姬</span>
                                <span class="other">&nbsp;/&nbsp;再见,我的妾  /  Farewell My Concubine</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
                    <div class="bd">
                        <p class="">
                            导演: 陈凯歌 Kaige Chen&nbsp;&nbsp;&nbsp;主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha...<br>
                            1993&nbsp;/&nbsp;中国大陆 香港&nbsp;/&nbsp;剧情 爱情 同性
                        </p>


                        <div class="star">
                                <span class="rating5-t"></span>
                                <span class="rating_num" property="v:average">9.6</span>
                                <span property="v:best" content="10.0"></span>
                                <span>989216人评价</span>
                        </div>

                            <p class="quote">
                                <span class="inq">风华绝代。</span>
                            </p>
                    </div>
                </div>
            </div>
        </li>

分析返回的结果

根据网页及返回的HTML:
网页的文字:

肖申克的救赎  / The Shawshank Redemption  / 月黑高飞(港) / 刺激1995(台) [可播放]
导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins /...
1994 / 美国 / 犯罪 剧情

 9.6 1338863人评价
希望让人自由。

我们需要以下信息:
名次、影片名称、国家、导演

  • 其中名次在图片的左边,对比HTML:
    • 名次包括在以下标签中
<em class="">1</em>
  • 影片名称(这里有点不太靠谱,re在这里可能会匹配到我们不想要的内容,可以使用其它方法,今后再说)
<img width="100" alt="霸王别姬" src="https
  • 国家
&nbsp;/&nbsp;美国&nbsp;/&nbsp;
  • 导演
导演: 陈凯歌 Kaige Chen&nbsp;&nbsp;&nbsp;主演

组合代码

把上述内容都组合在一起,把获取的结果放到文本文件中:

import requests
import re


def openurl(url):
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = {'User-Agent': user_agent}
    try:
        r = requests.get(url, headers = headers, timeout = 20)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('无法访问网页' + url)


if __name__ == '__main__':
    douban_250 = []

    for i in range(10):
        url = 'https://movie.douban.com/top250?start='
        url += str(i * 25)
        text = openurl(url)
        ranks = re.findall('<em class="">(.*)</em>', text)
        movie_names = re.findall('<img width="100" alt="(.*)" src="https', text)
        counties = re.findall('&nbsp;/&nbsp;(.*)&nbsp;/&nbsp;',text)
        directors = re.findall('导演: (.*)&nbsp;&nbsp;&nbsp;主演', text)

        z = zip(ranks, movie_names, counties, directors)
        for i in z:
            douban_250.append(i)

    with open('douban250.txt', 'w') as f:
        for i in douban_250:
            f.writelines(str(i) + '\n')

成果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43720396/article/details/88081249