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

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

编程文章jaq1232025-05-09 6:12:4910A+A-

前情回顾

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

  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

测试看一下效果:


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

最后

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

点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21