此貨很干,跟上腳步!!!
Cookie
cookie是什么東西?
小餅干?能吃嗎?
簡(jiǎn)單來(lái)說(shuō)就是你第一次用賬號(hào)密碼訪問(wèn)服務(wù)器
服務(wù)器在你本機(jī)硬盤(pán)上設(shè)置一個(gè)身份識(shí)別的會(huì)員卡(cookie)
下次再去訪問(wèn)的時(shí)候只要亮一下你的卡片(cookie)
服務(wù)器就會(huì)知道是你來(lái)了,因?yàn)槟愕馁~號(hào)密碼等信息已經(jīng)刻在了會(huì)員卡上
需求分析
爬蟲(chóng)要訪問(wèn)一些私人的數(shù)據(jù)就需要用cookie進(jìn)行偽裝
想要得到cookie就得先登錄,爬蟲(chóng)可以通過(guò)表單請(qǐng)求將賬號(hào)密碼提交上去
但是在火狐的F12截取到的數(shù)據(jù)就是,
網(wǎng)易云音樂(lè)先將你的賬號(hào)密碼給編了碼,再發(fā)post請(qǐng)求
所以我們?cè)跍?zhǔn)備表單數(shù)據(jù)的時(shí)候就已經(jīng)被卡住了
這時(shí)候我們就可以使用自動(dòng)化測(cè)試Selenium幫助我們?nèi)サ卿?br />
登錄好之后就獲取cookie給爬蟲(chóng)使用
OK,廢話也廢話完了,直接開(kāi)整吧!!
首先跟我創(chuàng)建一個(gè)爬蟲(chóng)項(xiàng)目和爬蟲(chóng)
在cmd創(chuàng)建
用Pycharm打開(kāi)這個(gè)項(xiàng)目
首先修改配置文件setting.py
1.關(guān)閉機(jī)器人協(xié)議
2.取消禁用cookie的功能
現(xiàn)在就回到爬蟲(chóng)文件wyySpider.py準(zhǔn)備前期的工作
修改start_urls里的網(wǎng)址和準(zhǔn)備一個(gè)請(qǐng)求頭
首先用火狐瀏覽器打開(kāi)網(wǎng)易云音樂(lè),登錄后進(jìn)入到個(gè)人主頁(yè)
在爬蟲(chóng)代碼那里準(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)
沒(méi)有這個(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)盤(pán)下載:
鏈接: https://pan.baidu.com/s/1M-gME2R8EEhEoFlPaDhbmA 提取碼: 7iai
解壓后記住這個(gè)驅(qū)動(dòng)的位置,在爬蟲(chóng)文件寫(xiě)一個(gè)獲取cookie的函數(shù)
以下代碼的坐標(biāo)不一定適合各位的電腦,不過(guò)給你們安利個(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)登錄-----------------------
# 打開(kāi)谷歌然后訪問(wèn)指定的網(wǎng)站
driver.get("https://music.163.com/")
# 最大化,睡眠是怕網(wǎng)速慢沒(méi)加載出來(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(1435, 35).click().perform()
time.sleep(0.3)
# 點(diǎn)擊其他方式
ActionChains(driver).move_by_offset(-480, 575).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)密碼
# 通過(guò)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(110, 15).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(0, 40).click().perform()
time.sleep(0.5)
# 點(diǎn)擊喜歡的音樂(lè)
ActionChains(driver).move_by_offset(-870, 830).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是字符串類(lèi)型的,所以我們要做一個(gè)轉(zhuǎn)型
# 將driver獲取的字典類(lèi)型的cookie提取name和value封裝成字符串
temp = []
for i in driver.get_cookies():
temp.append(i['name'] + "=" + i['value'])
# 返回字符串cookie
return ';'.join(temp)
所以這個(gè)函數(shù)基本就寫(xiě)完了,自動(dòng)登錄后獲取cookie是不是很爽!!!
現(xiàn)在重寫(xiě)一下def start_requests(self),這個(gè)函數(shù)是在請(qǐng)求發(fā)起前執(zhí)行的
在這個(gè)函數(shù)把請(qǐng)求頭給塞進(jìn)去,因?yàn)閟etting那邊沒(méi)有定義
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ù)寫(xiě)進(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)爬蟲(chóng)的命令,眨眨眼的時(shí)間 ~
數(shù)據(jù)就進(jìn)去了哦!原來(lái)我的喜愛(ài)歌單只有不到500~
下面就是爬蟲(chóng)源代碼
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)登錄-----------------------
# 打開(kāi)谷歌然后訪問(wèn)指定的網(wǎng)站
driver.get("https://music.163.com/")
# 最大化,睡眠是怕網(wǎng)速慢沒(méi)加載出來(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(1435, 35).click().perform()
time.sleep(0.3)
# 點(diǎn)擊其他方式
ActionChains(driver).move_by_offset(-480, 575).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)密碼
# 通過(guò)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(110, 15).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(0, 40).click().perform()
time.sleep(0.5)
# # 點(diǎn)擊喜歡的音樂(lè)
# ActionChains(driver).move_by_offset(-870, 830).click().perform()
# time.sleep(0.3)
# -----------------selenium自動(dòng)登錄-----------------------
# 將driver獲取的字典類(lèi)型的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ù)寫(xiě)進(jìn)txt文件
with open(file="response.txt", mode="w+", encoding="utf-8") as file:
for item in listdata:
file.write(item+"\n")
到此這篇關(guān)于Scrapy+Selenium自動(dòng)獲取cookie爬取網(wǎng)易云音樂(lè)個(gè)人喜愛(ài)歌單的文章就介紹到這了,更多相關(guān)Scrapy+Selenium爬取網(wǎng)易云音樂(lè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Selenium獲取登錄Cookies并添加Cookies自動(dòng)登錄的方法
- Selenium webdriver添加cookie實(shí)現(xiàn)過(guò)程詳解
- selenium中g(shù)et_cookies()和add_cookie()的用法詳解
- Python Selenium Cookie 繞過(guò)驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼
- 利用selenium 3.7和python3添加cookie模擬登陸的實(shí)現(xiàn)
- Python中Selenium對(duì)Cookie的操作方法