多进程爬取电影

2020-05-09 15:43:20 浏览数 (2)

代码语言:javascript复制
这是一个多进程爬取电影的爬虫,因为下载电影的话用单进程是在苦不堪言,速度感人
一开始就遇到了一个大坑,尅是只是用了多进程,但是没有使用队列,最后发现下载下来的数据虽然
按照我预想的规则l 0000 .ts 这种格式来命名了,但是有个致命的地方,本来文件名字就是无序的,
然后没有使用队列的多进程又再一次打乱了顺序,导致最后拼接的电影成了ppt,然后就各种百度谷歌,
现学现卖吧,写了这个多进程的队列爬虫,下载速度还过得去,还有待优化呀。
 
import requests
import random
import multiprocessing
import time
 
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36'
         ' (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'} # 请求头
t=[
    '47.75.194.109:80',
    '202.117.121.253:8080',
    '47.101.134.187:8888',
    '112.74.185.33:80',
    '47.101.134.187:8888',
    '112.74.185.33:80',
    '118.24.7.218:80',
    '47.75.62.90:80',
    '47.52.209.8:80',
    '118.25.49.225:80',
]
# 代理ip池,可以去各大免费的代理ip网站上面爬下来自己维护一份可用的代理池,多线程的时候用得到
ht={'http':random.choice(t)} # 构造代理ip # 用random里面的choice 从ip列表里面随机抽一个ip来请求
def get_url():
    url = 'https://v3.szjal.cn'
    with open('./index.m3u8','r')as f:
        a=f.readlines() # 我这里是读取本地的文件,逐行读取
        aa=[]
        for x in a:
            if '/' in x: # 因为文件隔行就是一行干扰字符,所以跳过他,干扰字符是# 开头,
                        # 需要的链接地址是/开头,所以用if就可以判断了
                # aa.append(url x[:-1]) # 返回一份列表 这里是用来测试队列是否按照index.m3u8的循环排列的
                q.put(url x[:-1]) # 如果是正确的链接就加入队列中给多进程调用 这里进行了连接拼接操作
    # return aa
    
    
def download(url1,n):
    movies=requests.get(url1,headers=headers,proxies=ht).content
    with open(fr'./t/l{n}.ts','wb ')as f:
        f.write(movies)
        print('保存成功',url1) # 保存成功后返回提示信息
 
 
if __name__ == '__main__':
    s_time = time.time()
    q=multiprocessing.Queue() # 创建空的队列
    pool = multiprocessing.Pool(20) # 开启20个进程
    n=0 # 启动计数,用来重命名文件,
 
    while not q.empty(): # 如果队列不为空就一直执行下面的进程
        n =1
        pool.apply_async(download,(q.get(),'d' % n)) # 开启多进程并传入n作为命名参数,共4位数字,不够用0占位
    pool.close() # 进程满了之后禁止在添加新的任务
    pool.join() # 进程阻塞
 
    print('总共用时:',int(time.time()-s_time),'s')
 
爬虫就到这了,有兴趣玩爬虫的可以一起玩玩呀
 

0 人点赞