python 多线程抓取xunlei磁力下载链接

import urllib.request
import re
import time
import threading


class Spider(object):

    def __init__(self):
        # 定义字典,用于保存影片信息
        self.films_dict = {}
        self.i = 1
        self.lock1 = threading.Lock()

    def start(self):

        # 调用下载函数,获取下载连接
        for page in range(1, 3):
            t1 = threading.Thread(target=self.get_movie_links, args=(page,))
            t1.start()

        # 得到字典对应的数组
        list1 = self.films_dict.items()

        # 所有线程执行完毕后再退出
        while len(threading.enumerate()) != 1:
            time.sleep(1)

        # 遍历下载字典,获取影片名称,下载地址
        for file_name, film_link in list1:
            print("%s | %s" % (file_name, film_link))

    def get_movie_links(self, page):
        """获取列表页影片信息"""
        # 1列表页的1 列表页的地址
        film_list_url = "https://www.ygdy8.net/html/gndy/china/list_4_%d.html" % page
        # 2 打开url地址,获取数据(这个数据的是html代码数据并且是二进制数据)
        reponse_list = urllib.request.urlopen(film_list_url)
        # 2.1通过read() 读取网络资源数据
        response_list_data = reponse_list.read()
        # 3 解码获取到的数据
        response_list_text = response_list_data.decode("GBK")
        # 4 使用正则得到所有的影片的内容页地址地址
        # 4.1 使用findall() 根据正则查找所有影片对应的内容页地址
        url_list = re.findall("<a href=\"(.*)\" class=\"ulink\">(.*)</a>", response_list_text)
        # 4.3 循环便利内容页地址列表 url_list
        for content_url, film_name in url_list:
            content_url = "https://www.ygdy8.net" + content_url
            # print(content_url)
            # print("影片名称:%s, 内容与地址:%s" % (film_name, content_url))
            # 4.4 打开内容页
            response_content = urllib.request.urlopen(content_url)
            # 4.5 接受内容页数据
            response_content_data = response_content.read()
            # 4.7 解码得到内容页的文本内容
            response_content_text = response_content_data.decode("GBK")
            # 4.8 取出下载地址 https://www.ygdy8.net
            # print(response_content_text)
            # regexBuddy 工具中使用 = 号合法 , 在python中的正则 = 号不合法
            result = re.search(r" href=\"(.*?)\"><strong>|磁力链  (.*)</font>", response_content_text)
            # print(result.group(1))

            if result:
                # 5 保存影片名称和地址到字典中
                self.lock1.acquire()
                self.films_dict[film_name] = result.group(1)
                self.lock1.release()
                print("已经成功爬取%d个影片地址!" % self.i)
                self.i += 1
            else:
                continue


def main():
    film_spider = Spider()
    film_spider.start()


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python 多线程 M3U8 下载可以通过 `threading` 模块来实现。M3U8 是一种多媒体文件索引格式,用于切割和播放音视频流。使用多线程可以实现同时下载多个片段,提高下载速度。 首先,我们需要导入所需的模块: ```python import requests import threading ``` 接下来,我们可以定义一个下载函数,用于下载 M3U8 文件中的片段。在下载过程中,我们可以将每个片段保存到本地文件,然后再合并成完整的音视频文件。 ```python def download(url, filename): response = requests.get(url) with open(filename, 'wb') as file: file.write(response.content) ``` 然后,我们可以编写一个函数,用于解析 M3U8 文件,并获取其中的片段 URL。 ```python def parse_m3u8(m3u8_url): response = requests.get(m3u8_url) lines = response.text.split('\n') urls = [] for line in lines: if line.startswith('#EXTINF'): url = lines[lines.index(line) + 1] urls.append(url) return urls ``` 最后,我们可以使用多线程进行片段下载。我们可以创建多个线程,每个线程负责下载一个片段。 ```python def main(m3u8_url): urls = parse_m3u8(m3u8_url) threads = [] for i, url in enumerate(urls): filename = f'fragment_{i}.ts' thread = threading.Thread(target=download, args=(url, filename)) threads.append(thread) thread.start() for thread in threads: thread.join() print('文件下载完成!') ``` 调用 `main` 函数,并传入 M3U8 文件 URL 作为参数,即可开始多线程下载。 需要注意的是,多线程下载可能会带来一些问题,如网络不稳定、服务器限制等。因此,在实际使用时,我们可能需要对下载逻辑进行优化,以避免潜在的问题。 以上就是用 Python 实现多线程 M3U8 下载的简单介绍。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值