2018-07-04

一、目的:

个人比较喜欢看欧美电影,最近刚学了爬虫,所以敲了这个程序 来爬取 电影天堂IMB 评分8.0以上的 欧美电影 跟大家分享一下。

二、爬取电影天堂需要掌握的基本技能:

1、熟悉python的基本语法。

2、会使用 简单的正则表达式。

3、掌握beautifulsoup4的基本使用,了解网页源代码的组成结构。

4、了解requests模块的基本使用

三、过程:

步骤一:分析网页的基本结构

首先打开电影天堂 欧美电影 的栏目

1.png

1)我们发现 欧美电影栏目 的网址 是有规律的。

当我们点开 欧美电影的第一页 时网址 是 http://www.ygdy8.net/html/gndy/oumei/list_7_1.html

当我们点开 欧美电影的第二页 时网址 变为 http://www.ygdy8.net/html/gndy/oumei/list_7_2.html

也就是说其实 改变 网址页数的 该网址 7_ 之后的数字

2)接下来我们 点开 开发者工具查看网页源代码(F12)

image.png

我们发现 其实 每部电影的 内容 都是包含在一个 class=“tbspan”的table 里

于是我们可以使用beautiful的find_all函数 去获取 全部 class=“tbspan”的table

代码为:table = BeautifulSoup(content.text,"lxml").find_all('table',class_='tbspan')

我们点开 class=“tbspan”的table

image.png

我们可以发现 电影 内容简介 包含在一个a标签内

image.png

而该a标签的 文本内容(text)里包含了 “《”这个关键符号

于是我们可以使用正则以及beautifulsoup去找到a标签内的全部内容

代码为:table.find('a', text=re.compile("《"))

(table是 class=“tbspan”的table,因为a标签是包含在它之下,所以我们要在他的基础上找)

同理 电影的 IMB评分 以及详细内容 页 也是一样道理 可以取到

传入正则表达式,查找所有的td标签文本内容中含有IMB的内容 # td是匹配文本内容到包含“IMB”的内容的整条 td 标签内容

td = table.find('td', text=re.compile("IMD"))

3)然后我们点开其中一部电影 比如 《狂暴巨兽》

拉下来之后 我们 可以发现该电影的下载地址 那我们要怎么去获取呢?

image.png

打开开发者工具 查看源代码

image.png

我们发现 他的下载地址包含在 一个

"style": "WORD-WRAP: break-word" 的 td 标签里

于是我们去获取该标签

Td = BeautifulSoup(content.text,"lxml").find('td', attrs={"style": "WORD-WRAP: break-word"})

然后利用正则 获取 到 该电影下载地址

downloadA = downloadTd.find('a')

到此处 网页的基本结构分析就清楚 了 下面贴上源代码 ,不懂得可以查看注释

下面是代码:

import requests
from bs4 import BeautifulSoup
import re

#电影 详情页的的基本前缀
site = 'http://www.ygdy8.net'
#构建电影类
class Movie:
    def __init__(self, name, url, score, link):
        self.name = name
        self.url = url
        self.score = score
        self.link = link

    def __str__(self):
        return '%s,\t%s分,\t下载地址:%s' % (self.name, self.score, self.link)

    __repr__ = __str__


def getSoup(url):
    r = requests.get(url)
    r.encoding = 'gb18030'
    return BeautifulSoup(r.text, "html.parser")


def findMovie(url):
    movieList = []
    # 链接网址
    soup = getSoup(url)
    tables = soup.find_all('table', class_='tbspan')
    for table in tables:
        #传入正则表达式,查找所有的a标签文本内容中含有《的内容
        # aContent是匹配到a标签text里面包含《的整个a标签
        aContent = table.find('a', text=re.compile("《"))
        #传入正则表达式,查找所有的td标签文本内容中含有IMB的D内容
        # td是匹配文本内容到包含“IMB”的内容的整条 td 标签内容
        td = table.find('td', text=re.compile("IMD"))

        if td is not None:
            # 利用正则找到电影的评分
            # +?匹配一次或更多次的重复,但是在能使整个匹配成功的前提下使用最少的重复
            # 只匹配 +?的值 即如   评分 6.0/10  只输出 【‘6.0’】
            # 因为 有/  为了不为被当成转义符所以需要在前面r
            scoreStr = re.findall(r"评分 (.+?)/10", td.text)

            if (len(scoreStr) > 0):
                try:
                    # 将字符串 转换为 浮点型
                    score = float(scoreStr[0])
                    if (score > 8):
                        name = aContent.text
                        print(name)
                        # 此处的url 是 电影的详情页面
                        url = site + aContent['href']
                        print('url:', url)
                        print('title:', name)
                        print('score:', score)
                        # downloadLink是获得电影的下载地址
                        downloadLink = getDownloadLink(url)
                        movie = Movie(name, url, score, downloadLink)
                        movieList.append(movie)
                except:
                    print('error !!')
    return movieList

#该方法是用来获取电影下载地址的
def getDownloadLink(url):
    soup = getSoup(url)
    downloadTd = soup.find('td', attrs={"style": "WORD-WRAP: break-word"})
    downloadA = downloadTd.find('a')
    return downloadA['href']

#该方法是用来保存电影的信息到本地文本文件的
def saveMovie(movieList):
    #打开文本文件
    fileObj = open('movie.txt', 'a')
    for movie in movieList:
        movie_str = str(movie)
        print('movie info:', movie_str)
        fileObj.write(movie_str)
        fileObj.write('\n')
        fileObj.write(
            '————————————————————————————————————————————————————————————————————————————————————————————————')
        fileObj.write('\n')

    fileObj.close()


def getPageResource(url):
    resultList = findMovie(url)
    if len(resultList) > 0:
        saveMovie(resultList)


if __name__ == '__main__':
    for index in range(156):
        index += 1
        #电影天堂网的欧美电影基本前缀
        #在网页中第一页的地址为http://www.ygdy8.net/html/gndy/oumei/list_7_1.html
        #在网页中第一页的地址为http://www.ygdy8.net/html/gndy/oumei/list_7_2.html
        #容易发现其实网页改变页数 其实是改变 7_之后的数字
        #此处的url 为 欧美电影 的 地址  index 表示页数
        url = 'http://www.ygdy8.net/html/gndy/oumei/list_7_' + \
              str(index) + '.html'
        getPageResource(url)

运行结果展示:

image.png
image.png

三:心得体会:

此次爬虫加深了我对python 基础语法的掌握,也让我发现了python的有趣,在学习爬虫的过程中,我遇到了很多困难,第一个困难是 解析网页的结构,我觉得这是爬虫中很重要的一部分。第二个是,Beautifulsoup的 使用,有些语法不是很清楚。第三个是正则表达式的运用。第四是经常遇到反爬虫无法进行下去。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • java--邮箱的正则表达式匹配 软件包 java.util.regex 用于匹配字符序列与正则表达式指定模式的类...
    一瓶百无聊赖阅读 2,693评论 0 0
  • 我们DOAEZ品牌创立于2016年,隶属于小池集团旗下,旨在打造精品轻奢型的民族美妆品牌。 🥇DOAEZ融合了欧美...
    sxh小杭阅读 569评论 0 0
  • 我知道,我不是因为偶然才来到这个世界的,我是主动想来的,我是为了继续前生伟大、美好、无私的梦想而来的,我是为了通过...
    未来的美好1111111阅读 109评论 0 0
  • 高中生物基础知识考前最后梳理(1) 第一单元 细胞的分子组成与结构 1.蛋白质、核酸的结构和功能 (1)蛋白质主要...
    itm_7913阅读 976评论 0 2
  • 01 多少爱情可以承受时光的变迁 很多人都说爱情可遇而不可求,很多都是单恋,你喜欢的,人家不喜欢你,而你不喜欢的,...
    紫小兔阅读 496评论 0 3