为了账号安全,请及时绑定邮箱和手机立即绑定

代码出现问题

import requests,time,random
from lxml import etree
from multiprocessing import Pool
from threading import Thread
from urllib import request
user_agent = [
       "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
       "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
       "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
       "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
       "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
]
headers={"User-Agent": random.choice(user_agent)}
filk=r'C:\Users\25063\Desktop\音乐'
class jiuku(Thread):
    url='http://www.9ku.com/x1/music/by_new.php?act=t_m_hits&page='
    def __init__(self,star_page,end_page):
        super(jiuku,self).__init__()
        self.star_page=star_page
        self.end_page=end_page
        self.music_list=[]
    def get_one_html(self,page):
        '''获取一个页面的html'''
        now_url=self.url+str(page)
        print(now_url)
        r=requests.get(now_url,headers=headers)
        return r.text
    def get_many_url(self,html):
        '''根据html解析得到音乐的url'''
        xml=etree.HTML(html)
        music_url=xml.xpath('//ol/li/a/@href')
        for urls in music_url:
            url='http://www.9ku.com'+urls
            self.music_list.append(url)
        return self.music_list
    def down_one_music(self,url):
        r=requests.get(url,headers=headers)
        xml=etree.HTML(r.text)
        title=xml.xpath('//div[@class="playingTit"]/h1/text()')[0]
        singer=xml.xpath('//div[@class="playingTit"]/h2/a/text()')[0]
        music=title+'-'+singer
        music_id=url.split('/')[-1].split('.')[0]#获取音乐的id
        print('正在下载:{}'.format(music))
        music_url='http://mp3.9ku.com/m4a/{}.m4a'.format(music_id)
        request.urlretrieve(music_url,filk+music+'.mp3')
    def run(self):
        for page in range(self.star_page,self.end_page):
            time.sleep(1)
            html=self.get_one_html(page)
            music_list=self.get_many_url(html)
            pool=Pool()
            '''使用多进程进行下载,但是出错'''
            pool.map(self.down_one_music,[url for url in music_list])
            # for i in music_list:
            #     self.down_one_music(i)
def main():
    number = int(input('请输入要爬取的页数:'))
    if number <= 4:
        a = [i for i in range(0, number+1)]
        a1_min = min(a)
        a1_max = max(a)
        down = jiuku(a1_min, a1_max)
        down.start()
    else:
        a = [i for i in range(0, number)]
        d = number / 4  # 得到的数是一个浮点数
        e = int(d)  # 这一步是对浮点数变为整数,程序会将整数后面的小数全部清理这是的e就会小于d
        if d > e:  # 判断如果e小于b则就需要将每个小列表中的数量为e+1
            step = e + 1
            b = [a[i:i + step] for i in range(0, len(a), step)]
        else:
            step = e
            b = [a[i:i + step] for i in range(0, len(a), step)]
        a1_max = max(b[0])
        a1_min = min(b[0])
        a2_max = max(b[1])
        a2_min = min(b[1])
        a3_max = max(b[2])
        a3_min = min(b[2])
        a4_max = max(b[3])
        a4_min = min(b[3])
        down = jiuku(a1_min, a1_max)
        down.start()
        down1 = jiuku(a2_min, a2_max)
        down1.start()
        down2 = jiuku(a3_min, a3_max)
        down2.start()
        down3 = jiuku(a4_min, a4_max)
        down3.start()
if __name__ == '__main__':
    main()
# def main():
#     a=int(input('da:'))
#     d=int(input('agd:'))
#     down=jiuku(a,d)
#     down.run()
# if __name__ == '__main__':
#     main()

上面的代码 我是打算使用多进程家多线程进行下载但是出错 为什么?

正在回答

4 回答

1、线程如果使用Thread,在子线程中再用进程池Pool 就会报错,原理不太清楚,可能需要老师来回答了,换用Process 就没问题了;

2、这个音乐的页面应该是从page=1开始的,所以我稍微改了一下入参。你可以看一下。

0 回复 有任何疑惑可以回复我~
import requests, time, random
from lxml import etree
from multiprocessing import Pool
from multiprocessing import Process
from urllib import request
from urllib import error

user_agent = [
    "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
    "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
]
headers = {"User-Agent": random.choice(user_agent)}
filk = r'D:\Users\zgl\Music\\'


class Jiuku(Process):
    url = 'http://www.9ku.com/x1/music/by_new.php?act=t_m_hits&page='

    def __init__(self, threadID, star_page, end_page):
        super().__init__()
        self.threadID = threadID
        self.star_page = star_page
        self.end_page = end_page
        self.music_list = []

    def get_one_html(self, page):
        """获取一个页面的html"""
        now_url = self.url + str(page)
        print("线程:{},页面链接:{}".format(self.threadID, now_url))
        r = requests.get(now_url, headers=headers)
        return r.text

    def get_many_url(self, html):
        """根据html解析得到音乐的url"""
        try:
            xml = etree.HTML(html)
            music_url = xml.xpath('//ol/li/a/@href')
            for urls in music_url:
                url = 'http://www.9ku.com' + urls
                self.music_list.append(url)
        except AttributeError:
            print("当前页面无音乐链接")
        return self.music_list

    def run(self):
        # print("线程:{},开始页:{},结束页:{}".format(self.threadID, self.star_page, self.end_page))
        for page in range(self.star_page, self.end_page + 1):
            time.sleep(1)
            # print("当前页数:{}".format(page))
            html = self.get_one_html(page)
            self.get_many_url(html)
            pool = Pool(10)
            pool.map(down_one_music, self.music_list, 10)
            # print("线程:{},音乐链接列表:{}".format(self.threadID, self.music_list))
            # for i in self.music_list:
            #    print("音乐链接:{}".format(i))
            #    down_one_music(i)
            self.music_list.clear()


def down_one_music(url):
    if url:
        # print("音乐链接:{}".format(url))
        try:
            r = requests.get(url, headers=headers)
            xml = etree.HTML(r.text)
            title = xml.xpath('//div[@class="playingTit"]/h1/text()')[0]
            singer = xml.xpath('//div[@class="playingTit"]/h2/a/text()')[0]
            music = title + '-' + singer
            music_id = url.split('/')[-1].split('.')[0]  # 获取音乐的id
            print('正在下载:{}'.format(music))
            music_url = 'http://mp3.9ku.com/m4a/{}.m4a'.format(music_id)
            request.urlretrieve(music_url, filk + music + '.mp3')
        except error.HTTPError:
            print("{}已下线".format(music))


def main():
    number = int(input('请输入要爬取的页数:'))
    if number <= 4:
        a = [i for i in range(1, number + 1)]
        a_min = min(a)
        a_max = max(a)
        down = Jiuku("Thread-1", a_min, a_max)
        down.start()
    else:
        a = [i for i in range(1, number + 1)]
        d = number / 4  # 得到的数是一个浮点数
        e = int(d)  # 这一步是对浮点数变为整数,程序会将整数后面的小数全部清理这是的e就会小于d
        if d > e:  # 判断如果e小于b则就需要将每个小列表中的数量为e+1
            step = e + 1
            b = [a[i:i + step] for i in range(0, len(a), step)]
        else:
            step = e
            b = [a[i:i + step] for i in range(0, len(a), step)]

        for index in range(len(b)):
            a_max = max(b[index])
            a_min = min(b[index])
            down = Jiuku("Thread-" + str(index), a_min, a_max)
            down.start()


if __name__ == '__main__':
    main()


0 回复 有任何疑惑可以回复我~
import requests, time, random
from lxml import etree
from multiprocessing import Pool
from multiprocessing import Process
from urllib import request
from urllib import error

user_agent = [
    "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
    "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
]
headers = {"User-Agent": random.choice(user_agent)}
filk = r'D:\Users\zgl\Music\\'


class Jiuku(Process):
    url = 'http://www.9ku.com/x1/music/by_new.php?act=t_m_hits&page='

    def __init__(self, threadID, star_page, end_page):
        super().__init__()
        self.threadID = threadID
        self.star_page = star_page
        self.end_page = end_page
        self.music_list = []

    def get_one_html(self, page):
        """获取一个页面的html"""
        now_url = self.url + str(page)
        print("线程:{},页面链接:{}".format(self.threadID, now_url))
        r = requests.get(now_url, headers=headers)
        return r.text

    def get_many_url(self, html):
        """根据html解析得到音乐的url"""
        try:
            xml = etree.HTML(html)
            music_url = xml.xpath('//ol/li/a/@href')
            for urls in music_url:
                url = 'http://www.9ku.com' + urls
                self.music_list.append(url)
        except AttributeError:
            print("当前页面无音乐链接")
        return self.music_list

    def run(self):
        # print("线程:{},开始页:{},结束页:{}".format(self.threadID, self.star_page, self.end_page))
        for page in range(self.star_page, self.end_page + 1):
            time.sleep(1)
            # print("当前页数:{}".format(page))
            html = self.get_one_html(page)
            self.get_many_url(html)
            pool = Pool(10)
            pool.map(down_one_music, self.music_list, 10)
            # print("线程:{},音乐链接列表:{}".format(self.threadID, self.music_list))
            # for i in self.music_list:
            #    print("音乐链接:{}".format(i))
            #    down_one_music(i)
            self.music_list.clear()


def down_one_music(url):
    if url:
        # print("音乐链接:{}".format(url))
        try:
            r = requests.get(url, headers=headers)
            xml = etree.HTML(r.text)
            title = xml.xpath('//div[@class="playingTit"]/h1/text()')[0]
            singer = xml.xpath('//div[@class="playingTit"]/h2/a/text()')[0]
            music = title + '-' + singer
            music_id = url.split('/')[-1].split('.')[0]  # 获取音乐的id
            print('正在下载:{}'.format(music))
            music_url = 'http://mp3.9ku.com/m4a/{}.m4a'.format(music_id)
            request.urlretrieve(music_url, filk + music + '.mp3')
        except error.HTTPError:
            print("{}已下线".format(music))


def main():
    number = int(input('请输入要爬取的页数:'))
    if number <= 4:
        a = [i for i in range(1, number + 1)]
        a_min = min(a)
        a_max = max(a)
        down = Jiuku("Thread-1", a_min, a_max)
        down.start()
    else:
        a = [i for i in range(1, number + 1)]
        d = number / 4  # 得到的数是一个浮点数
        e = int(d)  # 这一步是对浮点数变为整数,程序会将整数后面的小数全部清理这是的e就会小于d
        if d > e:  # 判断如果e小于b则就需要将每个小列表中的数量为e+1
            step = e + 1
            b = [a[i:i + step] for i in range(0, len(a), step)]
        else:
            step = e
            b = [a[i:i + step] for i in range(0, len(a), step)]

        for index in range(len(b)):
            a_max = max(b[index])
            a_min = min(b[index])
            down = Jiuku("Thread-" + str(index), a_min, a_max)
            down.start()


if __name__ == '__main__':
    main()

回复居然不能编辑,上面的格式不知道怎么回事,重新上传一下代码

0 回复 有任何疑惑可以回复我~
import requests, time, random
from lxml import etree
from multiprocessing import Pool
from multiprocessing import Process
from urllib import request
from urllib import error

user_agent = [
   "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
   "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
   "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
   "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
   "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
   "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
]
headers = {"User-Agent": random.choice(user_agent)}
filk = r'D:\Users\zgl\Music\\'


class Jiuku(Process):
   url = 'http://www.9ku.com/x1/music/by_new.php?act=t_m_hits&page='

   def __init__(self, threadID, star_page, end_page):
       super().__init__()
       self.threadID = threadID
       self.star_page = star_page
       self.end_page = end_page
       self.music_list = []

   def get_one_html(self, page):
       """获取一个页面的html"""
       now_url = self.url + str(page)
       print("线程:{},页面链接:{}".format(self.threadID, now_url))
       r = requests.get(now_url, headers=headers)
       return r.text

   def get_many_url(self, html):
       """根据html解析得到音乐的url"""
       try:
           xml = etree.HTML(html)
           music_url = xml.xpath('//ol/li/a/@href')
           for urls in music_url:
               url = 'http://www.9ku.com' + urls
               self.music_list.append(url)
       except AttributeError:
           print("当前页面无音乐链接")
       return self.music_list

   def run(self):
       # print("线程:{},开始页:{},结束页:{}".format(self.threadID, self.star_page, self.end_page))
       for page in range(self.star_page, self.end_page + 1):
           time.sleep(1)
           # print("当前页数:{}".format(page))
           html = self.get_one_html(page)
           self.get_many_url(html)
           pool = Pool(10)
           pool.map(down_one_music, self.music_list, 10)
           # print("线程:{},音乐链接列表:{}".format(self.threadID, self.music_list))
           # for i in self.music_list:
           #    print("音乐链接:{}".format(i))
           #    down_one_music(i)
           self.music_list.clear()


def down_one_music(url):
   if url:
       # print("音乐链接:{}".format(url))
       try:
           r = requests.get(url, headers=headers)
           xml = etree.HTML(r.text)
           title = xml.xpath('//div[@class="playingTit"]/h1/text()')[0]
           singer = xml.xpath('//div[@class="playingTit"]/h2/a/text()')[0]
           music = title + '-' + singer
           music_id = url.split('/')[-1].split('.')[0]  # 获取音乐的id
           print('正在下载:{}'.format(music))
           music_url = 'http://mp3.9ku.com/m4a/{}.m4a'.format(music_id)
           request.urlretrieve(music_url, filk + music + '.mp3')
       except error.HTTPError:
           print("{}已下线".format(music))


def main():
   number = int(input('请输入要爬取的页数:'))
   if number <= 4:
       a = [i for i in range(1, number + 1)]
       a_min = min(a)
       a_max = max(a)
       down = Jiuku("Thread-1", a_min, a_max)
       down.start()
   else:
       a = [i for i in range(1, number + 1)]
       d = number / 4  # 得到的数是一个浮点数
       e = int(d)  # 这一步是对浮点数变为整数,程序会将整数后面的小数全部清理这是的e就会小于d
       if d > e:  # 判断如果e小于b则就需要将每个小列表中的数量为e+1
           step = e + 1
           b = [a[i:i + step] for i in range(0, len(a), step)]
       else:
           step = e
           b = [a[i:i + step] for i in range(0, len(a), step)]

       for index in range(len(b)):
           a_max = max(b[index])
           a_min = min(b[index])
           down = Jiuku("Thread-" + str(index), a_min, a_max)
           down.start()


if __name__ == '__main__':
   main()


我将你的程序根据我的理解优化了一下,目前运行正常。可以参考一下。

http://img1.sycdn.imooc.com//5dbd940800017f8816910931.jpg


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Python开发简单爬虫
  • 参与学习       227670    人
  • 解答问题       1219    个

本教程带您解开python爬虫这门神奇技术的面纱

进入课程

代码出现问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信