代码语言: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')
爬虫就到这了,有兴趣玩爬虫的可以一起玩玩呀