運用多程序與程序池進行喜馬拉雅快速爬取

2021-08-25 06:09:51 字數 2042 閱讀 6160

import requests

from lxml import etree

import os

from urllib import request

# def base_response():

def list_url(queue):

# 這裡沒有設定頁數, 只設定了固定當前頁

base_url = ''

headers =

# 進行第一次請求

response = requests.get(base_url,headers=headers)

html = response.text

# 匹配頁面中每首歌的 href路徑

html_ele = etree.html(html)

html_url = html_ele.xpath('//*[@class="doi2"]/li/div[2]/a/@href')

html_href = ''

# xpath 匹配 返回過來的是列表型別

for i in html_url:

# 擷取最後一串id數字與列表頁的 路徑進行拼接

# 所以 我們就不需要再次請求到詳情歌曲內再次獲取了

ob = html_href + i.split('/')[-1]

html_url_src(ob,queue,headers)

# html_url = html_ele.xpath('//*[@id="root"]/main/section/div/div[2]/div[1]/div[2]/div[2]/ul/li/div[2]/a/@href')

def html_url_src(href_scr,queue,headers):

# 向 每首歌的ajax url傳送請求

ob_response = requests.get(href_scr,headers=headers)

ajax_data = ob_response.json()

ajax_tracksforaudioplay=ajax_data['data']['tracksforaudioplay']

for x in ajax_tracksforaudioplay:

ajax_name = x['trackname'] # 獲取每首歌的 名稱

# 存入通訊列隊中

queue.put((ajax_src,ajax_name))

def download_src(src_mp4):

print(src_mp4)

if not os.path.exists('dowlond'):

os.mkdir('dowlond')

(ajax_src,ajax_name) = src_mp4

faml = 'dowlond/'+ajax_name+'.mp4'

ob = request.urlretrieve(ajax_src,faml)

if __name__ == '__main__':

from multiprocessing import queue,process,pool

# 建立 通訊

q = queue()

# 建立程序 進行獲取第一次請求的url

process = process(target=list_url,args=(q,))

process.start()

download_pool = pool(10)

for i in range(0,340):

src_mp4 = q.get()

download_pool.close()

download_pool.join()

process.join()

# list_response = requests.get(i,headers=headers)

# print(list_response)

# if __name__ == '__main__':

# ob = base_response()

# print(ob)

Python 多程序與程序池

fork方法是呼叫一次,返回兩次,原因在於作業系統將當前程序 父程序 複製出乙份程序 子程序 這兩個程序幾乎完全相同,於是fork方法分別在父程序和子程序中返回。子程序中永遠返回0,父程序中返回的是子程序的id。importos if name main print current process ...

02 5多程序 程序池

coding utf 8 import time,random from multiprocessing import pool defworker msg t start time.time print s開始執行 msg random.random 隨機生成0 1之間的浮點數 time.slee...

python多程序之程序池

在利用python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多台主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數量卻又太過繁瑣,此時可以...