碎片时间学Python-16抓取资源链接

前情回顾

前面章节,我们通过抓取电影榜单数据,获取到了电影名称的列表,这些数据我们该怎么用?所以我们梳理了手动搜索单个资源时的流程:

  1. 我们会将电影名称作为查询条件,在资源网站中进行搜索




  1. 如果在搜索结果页面有数据(即:电影名称查询到了资源),我们将点击进入详情界面



  1. 详情界面复制获取资源的下载链接


Python实现

将上述手动过程通过程序化思维的方式转换为函数。

首先我们需要一个函数,通过传入电影名称,就能类似搜索一般,返回搜索的结果。只不过这里我们返回的是一个详情界面的网址,因为手动过程中我们可以看到,搜索出来的电影信息都是可以点击打开另一个页面。如图红框:

代码实现:

def get_movie_detail_url(url, movie_name):
    '''
    获取电影详情页链接
        :param url: 电影资源网站url
        :param movie_name: 电影名称
        :return: 返回电影详情页链接
    '''
    # post荷载的参数
    data = {
        'wd' : movie_name,
        'p' : 1,
        't': 'MIfVRL7daDheqyB0HbsPPw==', # 从浏览器调试工具中获取
    }
    # 拼接搜索url
    search_url = url + '/search/'
    # 通过requests库发送POST请求,进行电影搜索
    response = requests.post(search_url, headers=headers, data=data, timeout=(5, 10))
    # 对搜索结果进行网页解析
    soup = BeautifulSoup(response.content, 'html.parser')
    # 搜索结果网页中,是否查询到电影
    movies = soup.find_all('div', class_='text_info')
    # 如果没有查询到电影,返回空
    detail_url = None
    # 如果查询到电影
    if len(movies) > 0:
        # 取出第一个电影的链接,格式为 /detail/451.html
        detail = movies[0].find('a').get('href')
        if len(detail) > 0:
            # 拼接完整的电影详情页链接
            detail_url = url + detail
    # 返回电影详情页链接
    return detail_url

测试运行:

我们传入站点地址和一个电影的名称,结果如图:


这个链接就是电影详情页的地址

然后需要将电影详情页中的下载链接获取到。我们对详情页的地址再通过requests发起一次,并通过bs4解析。就可以得到资源的下载链接。代码如下:

def get_movie_download_url(detail_url):
    '''
    获取电影资源的下载链接
        :param detail_url: 电影详情页链接
        :return: 返回电影资源的下载链接
    '''
    # 老样子,发起请求
    detail_response = requests.get(detail_url, headers=headers, timeout=(5, 10))
    if detail_response != None:
        # 解析网页内容
        detail_soup = BeautifulSoup(detail_response.content, 'html.parser')
        # 分析网页html结构,找出下载链接对应的页面元素
        downlist = detail_soup.find_all('div', class_='url-left')
        # 过滤出ed2k 开头,且1080p的资源
        download_link = ''
        if len(downlist) > 0:
            for item in downlist:
                link = item.find('a').get('href')
                if link.startswith('ed2k'):
                    if link.find('1080p') != -1:
                        download_link = link
                        break
    return download_link

测试看一下效果:


至此,根据手动流程抽象出来的函数,功能正常。

最后

单条电影数据的流程测试通过。我们可以着手开始编写完整代码了。下一篇我们将串连整个流程,提供从抓取电影榜单数据,到获取下载链接的完整代码

相关文章

Python中如何复制列表

我们怎么复制一个列表呢,我们来看看下面代码list_test = [1, 2, 3]copy_list = list_test # 这只是引用,指向同一个内存地址copy_list[0] = 99pr...

python入门012:复制列表

一、复制列表复制列表即根据既有列表创建新的列表。1、切片复制我们可以通过创建一个包含原列表所有元素的切片,从而实现复制列表。方法是,切片区间同时省略元素的起始索引和终止索引,即[:],也就是创建一个初...

python学习——021列表里复制和引用的区别

Python 里列表复制和列表引用的区别,下面通过示例来详细分析:列表复制list_a = ['a', 'b', 'c'] list_b = list...

Python文件操作基础指南

以下是一份详细的 Python 基础文件操作指南,包含常见操作和示例代码:一、文件操作基本流程打开文件 → 2. 操作文件 → 3. 关闭文件二、打开文件使用 open() 函数:python复制fi...

Python目录与文件操作教程

大家好,我是ICodeWR。今天要记录的是 如何使用Python进行常见的目录和文件操作。Python提供了强大的内置模块来处理文件和目录操作。1. 基本模块介绍Python中主要使用以下模块进行文件...

python组织和管理代码:模块和包、子模块和子包概念及举例

在Python中,模块和包是组织和管理代码的重要概念。同时,模块和包可以包含子模块和子包。下面我将为你详细解释这些概念。模块和包、子模块和子包的概念模块:模块是一个包含 Python 代码的文件,它可...