python帮你来追剧

前言

“武林至尊,宝刀屠龙,号令天下,莫敢不从。倚天不出,谁与争锋"。如此熟悉的台词想必勾起了无数人的童年记忆。这便是金庸著作《倚天屠龙记》中的经典台词。想必当时也有很多人替张无忌选择和谁在一起而烦恼。如今,新版《倚天屠龙记》正播的如火如荼,听说拍的挺不错的。当然今天我们不是来研究屠龙宝刀和武林秘籍的。今天我们来爬一爬新版《倚天屠龙记》中的女主-赵敏。
###项目环境
语言:Python3
编辑器:Pycharm
导包:requests,re,pypinyin
目标网站:美桌(http://www.win4000.com/)

目标网站分析


打开目标网站,点击导航栏明星图片。在下侧搜索框输入"陈钰琪"。搜索指定明星图片。然后见下一张图。

注意看网址栏圈出的正是明星名字的汉语拼音。考考大家,“钰"字怎么读啊?正确的应该读"yù”。不知道怎么地。这里就变成了"jue"。我想大概是把"珏"和"钰"混淆了。不过我们不必纠结于此。我换了其他几位明星都是明星名字的汉语拼音。我们找到网址的变化规律就可以了。

那么可以看到照片是分类展示的,下面有一个分页。我们点开开发者工具具体看一看。

点击其中一个分类,看右侧圆圈处html详细信息。有一个a标签。里面href属性正是打开这类照片的url。下面img标签中的src则是当前分类所显示的照片。再下面就是照片分类的title。可以看到title前面都有"陈钰琪"三个字。后面会用到。我们打开其中一个分类,继续看页面情况。

打开每一个分类之后。可以看到页面的上方显示了总的照片张数。和当前是第几张。右上侧有一个下载按钮。点击之后详情如右边圆圈所示。里面的url正是图片的地址。

上方这张图,可以看到图片的右侧有一个下一张图标。点击之后可以看到下一页的网址。我们再看最后一张图。

在页面尾部是一个分页。我们点击下一页。可以在右侧看到下一页的url的详情。好了。页面分析完了。我们来整理一下思路。

实现思路

1.打开目标明星所对应的网页,此时向我们展示的是第一页的分类。
2.得到当前页面所有分类所对应的url
3.依次访问每个分类对应的url
4.依次下载该分类下所有照片
5.重复以上步骤,直到下载完所有照片

代码详情

首先看主函数

def main():
    name = input ("请输入明星的名字:")
    nameUrl = "http://www.win4000.com/mt/" + ''.join(lazy_pinyin(name)) + ".html"
    root = "D://" + name + "//"
    try:
        text = get_html_text (nameUrl)
        if not re.findall (r'暂无(.+)!', text):
            if not os.path.exists (root):
                os.mkdir (root)
            down_pictures (text, root, name)
            try:
                nextPage = re.findall (r'next" href="(.+)"', text)[0]
                while nextPage:
                    nextText = get_html_text (nextPage)
                    down_pictures (nextText, root, name)
                    nextPage = re.findall (r'next" href="(.+)"', nextText)[0]
            except IndexError:
                print("已全部下载完毕")
    except TypeError:
        print("没有{}的照片".format (name))
    return

这里用户输入一个明星的名字。通过pypinyin这个库。将汉语名字转化成对应的汉语拼音。然后拼接成该明星所对应的url。请求该url下载照片。下载完之后继续下载下一页照片。直到下载完毕。
下载照片

def down_pictures(text, root, name):
    pageUrls = get_page_urls (text, name)
    titles = re.findall (r'alt="' + name + r'(.+)" ', text)
    for i in range (len (pageUrls)):
        pageUrl = pageUrls[i][0]
        path = root + titles[i] + "//"
        if not os.path.exists (path):
            os.mkdir(path)
        if not os.listdir (path):
            pageText = get_html_text (pageUrl)
            totalPics = int (re.findall (r'<em>(.+)</em>)', pageText)[0])
            downUrl = re.findall (r'href="(.+?)" class="">下载图片', pageText)[0]
            count = 1;
            while count <= totalPics:
                picPath = path + str (count) + ".jpg"
                r = requests.get (downUrl)
                with open (picPath, 'wb') as f:
                    f.write (r.content)
                    f.close ()
                print ('{} - 第{}张下载已完成\n'.format (titles[i], count))
                count += 1
                nextPageUrl = re.findall (r'href="(.+?)">下一张', pageText)[0]
                pageText = get_html_text (nextPageUrl)
                downUrl = re.findall (r'href="(.+?)" class="">下载图片', pageText)[0]
    return

首先获取当前页面所有分类url。依次下载该分类下所有照片。然后继续下载下一个分类。
######获取当前页所有分类url

def get_page_urls(text, name):
    re_pageUrl = r'href="(.+)">\s*<img src="(.+)" alt="' + name
    return re.findall (re_pageUrl, text)

请求网址

def get_html_text(url):
    r = requests.get(url, timeout=30)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    return r.text

最后运行程序,我们看看爬取结果

获取程序源码,关注公众号《元大头》后台回复【陈钰琪】

关注公众号哦

猜你喜欢

转载自blog.csdn.net/weixin_37557902/article/details/88969895