需要爬取的數(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”停止,即:
該鏈接是后面寫代碼的時(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¤tPage={}'.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)題,可留言哇
