1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        看我如何用 Python 爬取網(wǎng)易云音樂歌單

        共 16831字,需瀏覽 34分鐘

         ·

        2021-04-06 13:39

        作者:我不是禿頭哆唻咪

        https://blog.csdn.net/weixin_44864260/article/details/113428996

        此貨很干,跟上腳步!!!

        Cookie
        cookie是什么東西?
        小餅干?能吃嗎?
        簡(jiǎn)單來(lái)說就是你第一次用賬號(hào)密碼訪問服務(wù)器
        服務(wù)器在你本機(jī)硬盤上設(shè)置一個(gè)身份識(shí)別的會(huì)員卡(cookie)
        下次再去訪問的時(shí)候只要亮一下你的卡片(cookie)
        服務(wù)器就會(huì)知道是你來(lái)了,因?yàn)槟愕馁~號(hào)密碼等信息已經(jīng)刻在了會(huì)員卡上

        需求分析
        爬蟲要訪問一些私人的數(shù)據(jù)就需要用cookie進(jìn)行偽裝
        想要得到cookie就得先登錄,爬蟲可以通過表單請(qǐng)求將賬號(hào)密碼提交上去
        但是在火狐的F12截取到的數(shù)據(jù)就是,
        網(wǎng)易云音樂先將你的賬號(hào)密碼給編了碼,再發(fā)post請(qǐng)求
        所以我們?cè)跍?zhǔn)備表單數(shù)據(jù)的時(shí)候就已經(jīng)被卡住了
        這時(shí)候我們就可以使用自動(dòng)化測(cè)試Selenium幫助我們?nèi)サ卿?br>登錄好之后就獲取cookie給爬蟲使用

        OK,廢話也廢話完了,直接開整吧!!
        首先跟我創(chuàng)建一個(gè)爬蟲項(xiàng)目和爬蟲
        在cmd創(chuàng)建

        用Pycharm打開這個(gè)項(xiàng)目

        首先修改配置文件setting.py
        1.關(guān)閉機(jī)器人協(xié)議
        2.取消禁用cookie的功能

        現(xiàn)在就回到爬蟲文件wyySpider.py準(zhǔn)備前期的工作
        修改start_urls里的網(wǎng)址準(zhǔn)備一個(gè)請(qǐng)求頭

        首先用火狐瀏覽器打開網(wǎng)易云音樂,登錄后進(jìn)入到個(gè)人主頁(yè)

        在爬蟲代碼那里準(zhǔn)備一下,修改一下start_urls

        import scrapy
        from selenium import webdriver
        from selenium.webdriver.common.action_chains import ActionChains
        import time

        class WyyspiderSpider(scrapy.Spider):
            name = 'wyySpider'
            allowed_domains = ['163.com']
            start_urls = ['https://music.163.com/playlist?id=19xxxxx7']

        先實(shí)現(xiàn)一下自動(dòng)登錄功能獲取cookie
        首先導(dǎo)一下自動(dòng)化測(cè)試的包(Selenium)
        沒有這個(gè)包的話去控制臺(tái):pip --default-timeout=100 install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

        from selenium import webdriver
        from selenium.webdriver.common.action_chains import ActionChains
        import time

        導(dǎo)完包還要一個(gè)谷歌的驅(qū)動(dòng)程序,先看一下自己的谷歌版本
        到這網(wǎng)站下載相同版本的驅(qū)動(dòng)程序:https://sites.google.com/a/chromium.org/chromedriver/home

        如果版本跟我的一樣可以去網(wǎng)盤下載:
        鏈接: https://pan.baidu.com/s/1M-gME2R8EEhEoFlPaDhbmA 提取碼: 7iai

        解壓后記住這個(gè)驅(qū)動(dòng)的位置,在爬蟲文件寫一個(gè)獲取cookie的函數(shù)
        以下代碼的坐標(biāo)不一定適合各位的電腦,不過給你們安利個(gè)物理外掛(電腦微信截圖Alt+A)

                def getCookie(self):
                # 獲取谷歌的驅(qū)動(dòng),參數(shù)為剛剛驅(qū)動(dòng)程序的位置
                driver = webdriver.Chrome("C:/Users/Administrator/AppData/Local/Programs/Python38/Lib/site-packages/selenium/webdriver/chrome/chromedriver.exe")
                # -----------------selenium自動(dòng)登錄-----------------------

                # 打開谷歌然后訪問指定的網(wǎng)站
                driver.get("https://music.163.com/")

                # 最大化,睡眠是怕網(wǎng)速慢沒加載出來(lái)
                driver.maximize_window()
                time.sleep(1)

                # 鼠標(biāo)從(0,0)向x(1435px),y(35px)移動(dòng),用左鍵點(diǎn)擊一下
                ActionChains(driver).move_by_offset(143535).click().perform()
                time.sleep(0.3)

                # 點(diǎn)擊其他方式
                ActionChains(driver).move_by_offset(-480575).click().perform()
                time.sleep(0.3)

                # 同意條款
                ActionChains(driver).move_by_offset(-218-10).click().perform()
                time.sleep(0.3)

                # 手機(jī)登錄
                ActionChains(driver).move_by_offset(107-100).click().perform()
                time.sleep(0.3)

                # 輸入賬號(hào)密碼
                # 通過css選擇器獲取id為"p"的標(biāo)簽,然后send_keys就是模擬輸入一些信息
                driver.find_element_by_css_selector("#p").send_keys("賬號(hào)")
                driver.find_element_by_css_selector("#pw").send_keys("密碼")
                time.sleep(0.3)

                # 點(diǎn)擊登錄
                ActionChains(driver).move_by_offset(11015).click().perform()
                time.sleep(1)

                # 找到頭像懸浮
                img = driver.find_element_by_css_selector("div.head:nth-child(1) > img:nth-child(1)")
                ActionChains(driver).move_to_element(img).perform()
                time.sleep(0.5)
                # 點(diǎn)擊我的主頁(yè)
                ActionChains(driver).move_by_offset(040).click().perform()
                time.sleep(0.5)
                # 點(diǎn)擊喜歡的音樂
                ActionChains(driver).move_by_offset(-870830).click().perform()
                time.sleep(0.3)

                # -----------------selenium自動(dòng)登錄-----------------------

        登錄完畢后就可以獲取cookie,但看一下下面的cookie

        [{'domain''music.163.com''expiry'2147483647'httpOnly'False'name''WM_TID''path''/''secure'False'value''UnQj6SSNqN9BEVdubmNcEjpl%2B9DA'}, {'domain''music.163.com''expiry'2147483647'httpOnly'False'name''WM_NIKE''path''/''secure'False'value''9ca17ae2e6ffcda170e2e6ee87f4508ef58483ea4a97968ea7c54e879a8eaaf445aebc83b6e933f3f1c0b4c82af0fea7c3b92af697b7a6dc7b82afc09ad98ca695bc5082ecbcb1e772b7889b3d1c15bf28da0bbfb5b95aa8795f073adbc9c98ed79a28d8aa7f450f1ae9dd9b77a85edbf9ac625f1ef84d8f970b4e7bfd8cd21b48e8c8ec17df3e7a898f74488ef9bb5c837e2a3'}, {'domain''.music.163.com''httpOnly'False'name''WNMCID''path''/''sameSite''Strict''secure'False'value''fdygqk.1611989994304.01.0'}, {'domain''.music.163.com''httpOnly'False'name''WEVNSM''path''/''sameSite''Strict''secure'False'value''1.0.0'}, {'domain''music.163.com''expiry'2147483647'httpOnly'False'name''WM_NI''path''/''secure'False'value''6IyEYqBqpyZMITjt9DB4tPdzuXUFC%2BNyOiu3S04CTC5Nsv2Q4gkMM0BQ2SPZxQWvItmyodTwnsbSFFqD3rS84rG3qyG%2F31L7zdp9q7N%2BpRDmBw19hwtHD1UTE%3D'}, {'domain''.music.163.com''expiry'1927349994'httpOnly'False'name''NMTID''path''/''secure'False'value''00O-pWx8ZDJJQfiFkHzsgin07nYSmUAAAF3UhdN2w'}, {'domain''.163.com''expiry'4765589994'httpOnly'False'name''_ntes_nuid''path''/''secure'False'value''738fc9cd89d6d8799fa76b3348d25d7d'}, {'domain''.163.com''expiry'4765589994'httpOnly'False'name''_ntes_nnid''path''/''secure'False'value''738fc9cd89d6d8799fa76b3348d25d7d,1611989994150'}, {'domain''.music.163.com''expiry'1769671794'httpOnly'False'name''_iuqxldmzr_''path''/''secure'False'value''32'}, {'domain''.music.163.com''expiry'1769671794'httpOnly'False'name''JSESSIONID-WYYY''path''/''secure'False'value''OoCMxNwGV%5CfZD2OSzAXovf4ASVZsJ8UQ4sgg7JfH075cKTD%2FW3sMzZj%2BpayS1EnNVXzRm%2F2GxfzIoNv3FTjYxKeNFZWqf6UeiMSc1%2BG98kgsEM94juuE%5Cs18k2%2BPNPAp3hU0G%5CFDUtjkimCR5pgOIOI%3A1611991794102'}]

        是列表加字典的結(jié)構(gòu),而Scrapy的cookie是字符串類型的,所以我們要做一個(gè)轉(zhuǎn)型

        # 將driver獲取的字典類型的cookie提取name和value封裝成字符串
                temp = []
                for i in driver.get_cookies():
                    temp.append(i['name'] + "=" + i['value'])
                # 返回字符串cookie
                return ';'.join(temp)

        所以這個(gè)函數(shù)基本就寫完了,自動(dòng)登錄后獲取cookie是不是很爽!!!
        現(xiàn)在重寫一下def start_requests(self),這個(gè)函數(shù)是在請(qǐng)求發(fā)起前執(zhí)行的

        在這個(gè)函數(shù)把請(qǐng)求頭給塞進(jìn)去,因?yàn)閟etting那邊沒有定義

            def start_requests(self):
                # 定義請(qǐng)求頭的時(shí)候調(diào)用一下getCookie獲取一下cookie
                headers = {
                    'Cookie': self.getCookie(),
                    'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
                }
                # 注意url是個(gè)列表這里拿下標(biāo)[0],然后把headers請(qǐng)求頭塞進(jìn)去,交給parse函數(shù)
                yield scrapy.Request(url=self.start_urls[0], headers=headers, callback=self.parse)

        請(qǐng)求前一切準(zhǔn)備好之后,在解析函數(shù)(parse)進(jìn)行保存一下數(shù)據(jù),記得導(dǎo)re包

            def parse(self, response):
                # 匹配歌曲名的正則表達(dá)式
                patt = re.compile(r'<a href="/song.id=.*?">([^<|{]*?)</a>')

                # 找到所有歌曲名
                listdata = re.findall(patt, response.text)
                
                # 把數(shù)據(jù)寫進(jìn)txt文件
                with open(file="../response.txt", mode="w+", encoding="utf-8"as file:
                    for item in listdata:
                        file.write(item+"\n")

        一句啟動(dòng)爬蟲的命令,眨眨眼的時(shí)間 ~
        數(shù)據(jù)就進(jìn)去了哦!原來(lái)我的喜愛歌單只有不到500~

        下面就是爬蟲源代碼

        import scrapy
        from selenium import webdriver
        from selenium.webdriver.common.action_chains import ActionChains
        import time
        import re

        class WyyspiderSpider(scrapy.Spider):
            name = 'wyySpider'
            allowed_domains = ['163.com']
            start_urls = ['https://music.163.com/playlist?id=19xxxxx7']

            def getCookie(self):
                # 獲取谷歌的驅(qū)動(dòng),參數(shù)為剛剛驅(qū)動(dòng)程序的位置
                driver = webdriver.Chrome("C:/Users/Administrator/AppData/Local/Programs/Python38/Lib/site-packages/selenium/webdriver/chrome/chromedriver.exe")
                # -----------------selenium自動(dòng)登錄-----------------------

                # 打開谷歌然后訪問指定的網(wǎng)站
                driver.get("https://music.163.com/")

                # 最大化,睡眠是怕網(wǎng)速慢沒加載出來(lái)
                driver.maximize_window()
                time.sleep(1)
          # 以下坐標(biāo)以自己的電腦為準(zhǔn)
                # 鼠標(biāo)從(0,0)向x(1435px),y(35px)移動(dòng),用左鍵點(diǎn)擊一下
                ActionChains(driver).move_by_offset(143535).click().perform()
                time.sleep(0.3)

                # 點(diǎn)擊其他方式
                ActionChains(driver).move_by_offset(-480575).click().perform()
                time.sleep(0.3)

                # 同意條款
                ActionChains(driver).move_by_offset(-218-10).click().perform()
                time.sleep(0.3)

                # 手機(jī)登錄
                ActionChains(driver).move_by_offset(107-100).click().perform()
                time.sleep(0.3)

                # 輸入賬號(hào)密碼
                # 通過css選擇器獲取id為"p"的標(biāo)簽,然后send_keys就是模擬輸入一些信息
                driver.find_element_by_css_selector("#p").send_keys("賬號(hào)")
                driver.find_element_by_css_selector("#pw").send_keys("密碼")
                time.sleep(0.3)

                # 點(diǎn)擊登錄
                ActionChains(driver).move_by_offset(11015).click().perform()
                time.sleep(1)

                # 找到頭像懸浮
                img = driver.find_element_by_css_selector("div.head:nth-child(1) > img:nth-child(1)")
                ActionChains(driver).move_to_element(img).perform()
                time.sleep(0.5)
                # 點(diǎn)擊我的主頁(yè)
                ActionChains(driver).move_by_offset(040).click().perform()
                time.sleep(0.5)
                # # 點(diǎn)擊喜歡的音樂
                # ActionChains(driver).move_by_offset(-870, 830).click().perform()
                # time.sleep(0.3)


                # -----------------selenium自動(dòng)登錄-----------------------

                # 將driver獲取的字典類型的cookie提取name和value封裝成字符串
                # 臨時(shí)存放每個(gè)拼接好的key=value字符串
                temp = []

                # 遍歷driver給的cookies字典
                for i in driver.get_cookies():
                    temp.append(i['name'] + "=" + i['value'])

                # 返回字符串cookie
                return ';'.join(temp)

            def start_requests(self):
                # 定義請(qǐng)求頭的時(shí)候調(diào)用一下getCookie獲取一下cookie
                headers = {
                    'Cookie': self.getCookie(),
                    'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
                }
                # 注意url是個(gè)列表這里拿下標(biāo)[0],然后把headers請(qǐng)求頭塞進(jìn)去,交給parse函數(shù)
                yield scrapy.Request(url=self.start_urls[0], headers=headers, callback=self.parse)

            def parse(self, response):
                # 匹配歌曲名的正則表達(dá)式
                patt = re.compile(r'<a href="/song.id=.*?">([^<|{]*?)</a>')

                # 找到所有歌曲名
                listdata = re.findall(patt, response.text)

                # 把數(shù)據(jù)寫進(jìn)txt文件
                with open(file="response.txt", mode="w+", encoding="utf-8"as file:
                    for item in listdata:
                        file.write(item+"\n")
        < END >

        微信掃碼關(guān)注,了解更多內(nèi)容


        使用 Python 修改微信/QQ/支付寶運(yùn)動(dòng)步數(shù)


        用Python繪制北京近一年來(lái)空氣質(zhì)量熱力圖,看看北京的沙塵暴真的多嗎?


        瀏覽 84
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            可以免费观看的黄色视屏 | 丝袜黄片 | 99自拍视频在线 | 瑟瑟视频免费观看 | 脱美女衣服亲摸揉视频 | 麻豆乱婬一区二区三区 | 亚洲欧美国产精品专区久久 | 九九精品热播 | 成人在线观看无码 | 国产91视频在线观看 |