某寶周迅小細(xì)跟口紅評(píng)論數(shù)據(jù)——python爬取,邊獲取數(shù)據(jù)邊存儲(chǔ)(追加)excel表格

需要爬取的數(shù)據(jù):如下圖,發(fā)布的時(shí)間,評(píng)論內(nèi)容,顏色分類,以及用戶名。

環(huán)境:360瀏覽器

工具:jupyter notebook(建議使用notebook,pycharm需要安裝的包一時(shí)半會(huì)兒裝不上)


實(shí)驗(yàn)步驟:

第一步,找到詳情頁(yè)

用自己發(fā)賬號(hào)先登錄淘寶。

找到完美日記旗艦店,找到周迅代言的小細(xì)跟口紅產(chǎn)品,點(diǎn)擊進(jìn)入詳情頁(yè)。如下圖


滾動(dòng)鼠標(biāo),下拉,找到評(píng)論區(qū)。如圖


分析需要爬取的數(shù)據(jù)。本篇爬取該產(chǎn)品四個(gè)字段:發(fā)布時(shí)間、評(píng)論內(nèi)容、顏色分類、用戶名稱。


第二步,分析網(wǎng)頁(yè)數(shù)據(jù)

滾動(dòng)鼠標(biāo),到詳情頁(yè)下方,發(fā)現(xiàn)有多頁(yè)數(shù)據(jù)需要爬取。


按F12鍵,或是在頁(yè)面右上方找到“工具——>開(kāi)發(fā)人員工具”。


得到如下頁(yè)面(如果沒(méi)有內(nèi)容,請(qǐng)?jiān)俅伟碏5刷新)


點(diǎn)擊“NetWork”,再點(diǎn)擊“JS”,找到以“l(fā)ist_detail_rate.htm?...”開(kāi)頭的鏈接,點(diǎn)擊該鏈接,點(diǎn)擊右邊出現(xiàn)的框的“Preview”,以此找到“jsonp1097——>ra teList”,該數(shù)據(jù)列表里面存在所需要爬取的數(shù)據(jù)字段的內(nèi)容。


通過(guò)觀察發(fā)現(xiàn),“rateList”列表有20個(gè)子項(xiàng)數(shù)據(jù)?!眃isplayUserNick”為用戶名稱的字段,“auctionSku”為顏色分類的字段,“rateDate”為發(fā)布日期的字段,“rateContent”為評(píng)論內(nèi)容的字段。



現(xiàn)在,我們已經(jīng)找到所需要爬取的數(shù)據(jù)所在的數(shù)據(jù)包。

點(diǎn)擊右邊小框的“Headers”。找到“General”下的“Request URL”,復(fù)制到“currentPage=1”停止,即:

https://rate.tmall.com/list_detail_rate.htm?itemId=628774307843&spuId=1845961505&sellerId=3375170974&order=3¤tPage=1

該鏈接是后面寫代碼的時(shí)候需要用的url地址;

Request Method”告訴我們請(qǐng)求數(shù)據(jù)類型為get;“content-type”告訴我們,獲取到的數(shù)據(jù)文本格式為text/html格式,這意味著在寫代碼的時(shí)候需要使用.text或是.HTML()方法,獲取到文本內(nèi)容;”cookie”這一大段寫代碼的時(shí)候也需要復(fù)制下來(lái),“user-agent”也需要復(fù)制下來(lái),這兩個(gè)字段都是模擬人瀏覽網(wǎng)頁(yè)的,防止服務(wù)器端識(shí)別出是爬蟲(chóng)而觸發(fā)反爬機(jī)制,嚴(yán)重者封IP。



重點(diǎn)來(lái)了?。?!

第三步,寫爬蟲(chóng)代碼。

需要導(dǎo)入的包:

from pandas import DataFrame?#存儲(chǔ)數(shù)據(jù)

import pandas as pd?# 分析數(shù)據(jù)

import time?# 設(shè)置請(qǐng)求訪問(wèn)時(shí)間,模擬人瀏覽頁(yè)面

import random?# 隨機(jī)數(shù)

import requests?#發(fā)送請(qǐng)求

import re?# 使用正則表達(dá)式

from bs4 import BeautifulSoup?# 解析獲取到的文本

import openpyxl?#存儲(chǔ)數(shù)據(jù)

新建表,存儲(chǔ)數(shù)據(jù):

??wb=openpyxl.Workbook()

????sheet=wb.active?#打開(kāi)活動(dòng)表

????sheet.title='新表1'

????sheet['A1']='name' ???#列名

????sheet['B1']='auctionSku'?#列名

????sheet['C1']='rateDate'?#列名

? sheet['D1']='rateContent'?#列名

代碼詳情頁(yè)及其解釋

# 胡金麗 2017033213 2021/1/4

from pandas import DataFrame #存儲(chǔ)數(shù)據(jù)

import pandas as pd # 分析數(shù)據(jù)

import time # 設(shè)置請(qǐng)求訪問(wèn)時(shí)間,模擬人瀏覽頁(yè)面

import random # 隨機(jī)數(shù)

import requests #發(fā)送請(qǐng)求

import re # 使用正則表達(dá)式

from bs4 import BeautifulSoup # 解析獲取到的文本

import openpyxl #存儲(chǔ)數(shù)據(jù)


# 開(kāi)始運(yùn)行

if __name__ == "__main__":?

? ? wb=openpyxl.Workbook()

? ? sheet=wb.active

? ? sheet.title='新表1'

? ? #列名字段

? ? sheet['A1']='name'? ?

? ? sheet['B1']='auctionSku'

? ? sheet['C1']='rateDate'

? ? sheet['D1']='rateContent'

? ? # 淘寶只能抓取99頁(yè)數(shù)據(jù)

? ? for page in range(1,100):

? ? ? ? print('\n---------------------------------------------第{}頁(yè)---------------------------------------------'.format(page))

? ? ? ? # 設(shè)置每頁(yè)瀏覽間隔時(shí)間為8到12秒,模擬人瀏覽頁(yè)面。目前該區(qū)間比較合適,沒(méi)有爬到一半或者十多頁(yè)就中斷停止

? ? ? ? time.sleep(random.randint(8,12))

? ? ? ? # 設(shè)置代理,模擬人請(qǐng)求數(shù)據(jù)。該部分都是從“Headers”下的內(nèi)容復(fù)制過(guò)來(lái)的。

? ? ? ? myheader = {

? ? ? ? ? ? 'Accept':'*/*',

? ? ? ? ? ? 'Accept-Language':'zh-CN,zh;q=0.9',

? ? ? ? ? ? 'Referer':'https://detail.tmall.com/item.htm',

? ? ? ? ? ? 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',

? ? ? ? ? ? 'Cookie':'dnk=aaaaaahjl85529134; hng=CN%7Czh-CN%7CCNY%7C156; tracknick=aaaaaahjl85529134; lid=aaaaaahjl85529134; lgc=aaaaaahjl85529134; cookie2=19ee58633482f3b3310474989d89c887; t=d6a9ad72b863b4cd1cb1f61314183617; enc=WiRQwnC66VuVdX0z68e3hYy3f5su9lOe157KMqMD%2Fs4dhixFl2AYgc4T85GIqLAwfVi0NxmA9ajfODV%2FxysuDw%3D%3D; _tb_token_=fdee3535e3b7e; cna=BBB4GMzzhkoCAbfm0zFREDt4; xlly_s=1; uc1=cookie14=Uoe0ZNC9e%2BKKMg%3D%3D&cookie21=WqG3DMC9Fb5mPLIQo9kR&pas=0&cookie15=Vq8l%2BKCLz3%2F65A%3D%3D&cookie16=U%2BGCWk%2F74Mx5tgzv3dWpnhjPaQ%3D%3D&existShop=false; uc3=vt3=F8dCuAAn5eHaq2CrCcE%3D&lg2=UIHiLt3xD8xYTw%3D%3D&nk2=AnCFXU7mB8JX0Kdg6aEUtYM%3D&id2=UUGiEzvGzlBBwA%3D%3D; _l_g_=Ug%3D%3D; uc4=nk4=0%40AJtx9250k9HiX4n79Ml2yqgX%2F7uAJ47Vwtwzkg%3D%3D&id4=0%40U2OVG7BM3GpQuMDpD3srlyGrE8dh; unb=2908467432; cookie1=BxuQ17l5weJgXbqwM8qm4J%2BxYRcImAzb%2FOfytz7gynA%3D; login=true; cookie17=UUGiEzvGzlBBwA%3D%3D; _nk_=aaaaaahjl85529134; sgcookie=E100Hpx7yUIcAEy7AxNzW8aUdFpEzs4J4aQ8ZVjTHTw%2BQJ8B%2B5dJTq4M92FwuKjg5htvsNBJkB3LoEalh%2BeKFWRWVg%3D%3D; sg=421; csg=c903a057; x5sec=7b22726174656d616e616765723b32223a223530383636336634346665633238623832663164623034363532643038656539434c485378663846454b794a6965437374666d6131674561444449354d4467304e6a63304d7a49374d513d3d227d; tfstk=cQ15BOcik0mS57wEaaa28sYuPwAAaBZXo8tRPTAMtl576ybBDsjo_hTqr9mmMdLf.; l=eBSQ8Mi7OtFe6QOABO5Clurza77trIObzrFzaNbMiInca1rFGMiKeNQ2lOAyPdtxgtfATetrJmGnAReB76UdgZqhuJ1REpZZZxJ6-; isg=BL29Rhn1vi0BdRpBzfqpaE77zBm3WvGsupO5in8DsZWEtt_oR6mjfOEgYerwEglk'

? ? ? ? }

? ? ? ? # 將page的頁(yè)碼 賦值給 url_c ,形成每一頁(yè)的url地址

? ? ? ? url_c = 'https://rate.tmall.com/list_detail_rate.htm?itemId=628774307843&spuId=1845961505&sellerId=3375170974&order=3&currentPage={}'.format(page)

? ? ? ? # 發(fā)送get請(qǐng)求

? ? ? ? res = requests.get(url=url_c,headers=myheader)

? ? ? ? # 獲取到的內(nèi)容轉(zhuǎn)碼。.content方法獲取到的數(shù)據(jù)格式可以是text,也可以是html格式

? ? ? ? content = res.content.decode('utf-8')


? ? ? ? # 建立一個(gè)空列表,存儲(chǔ)每一頁(yè)的數(shù)據(jù)

? ? ? ? elem_list = []

? ? ? ? # 獲取到用戶名稱

? ? ? ? elem_list1=re.findall('"displayUserNick":"(.*?)"',content)

? ? ? ? # 獲取到顏色分類

? ? ? ? elem_list2= re.findall('"auctionSku":"(.*?)"',content)

? ? ? ? # 獲取到發(fā)布日期

? ? ? ? elem_list3=re.findall('"rateDate":"(.*?)"',content)

? ? ? ? # 獲取到評(píng)論內(nèi)容

? ? ? ? elem_list4=re.findall('"rateContent":"(.*?)"',content)

? ? ? ? # 將獲取的列表進(jìn)行轉(zhuǎn)置,形成每一行一條完整的記錄

? ? ? ? for num in range(len(elem_list1)):

? ? ? ? ? ? elem_list.append([elem_list1[num],elem_list2[num],elem_list3[num],elem_list4[num]])


? ? ? ? # 將每一天記錄添加進(jìn)表格

? ? ? ? for i in elem_list:

? ? ? ? ? ? sheet.append(i)

? ? ? ? print(elem_list)

? ? ? ? # 必須有這一步,存入perfectdiary_data.xlsx表

? ? ? ? wb.save('perfectdiary_data.xlsx')

? ? print("完成?。?!")

# 如果出現(xiàn)connectionerror的錯(cuò)誤,目前方法是:把頁(yè)碼范圍 range()起始點(diǎn) 改為沒(méi)有爬取成功的頁(yè)碼數(shù),表的名字改為不同之前的。

# 前面爬取沒(méi)有出錯(cuò)的頁(yè)碼已經(jīng)存儲(chǔ)到excel表格里面去了,重新運(yùn)行。后面只需要將兩個(gè)excel表格的內(nèi)容合并即可



結(jié)果如圖(沒(méi)有做數(shù)據(jù)清洗的哈):


完結(jié),撒花花

有問(wèn)題,可留言哇


求夸!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容