手把手帶你爬天貓,獲取杜蕾斯評論數據

↑ 關注 + 星標 ~ 有趣的不像個技術號

每晚九點,我們準時相約  


大家好,我是黃同學

聽說大家最近對爬蟲感興趣,所以今天手把手帶你爬天貓。

爬蟲爬什麼呢?

因爲海報出圈的杜蕾斯,真的是家喻戶曉。

不如就它吧

1、登錄天貓網站

  對於有些網站,需要登陸後纔有可能獲取到網頁中的數據。天貓網站就是其中的網站之一。

2、搜索指定網頁

  這裏我想要爬取的是杜蕾斯。因此我們直接搜索“杜蕾斯”。由於“杜蕾斯”的賣家有很多,這裏我們只選取頁面的第一個圖片,進行其中的“評論數據”的爬取。

 點擊第一個圖片,進入到我們最終想要爬取數據的網頁。可以看到該頁面有很多評論信息,這也是我們想要抓取的信息。

3、進行第一次請求測試

import pandas as pd
import requests
import re
import time

url = "https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.626d40c2tp5mYQ&id=43751299764&skuId=4493124079453&areaId=421300&user_id=2380958892&cat_id=2&is_b=1&rn=cc519a17bf9cefb59ac94f0351791648"
headers ={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
data = requests.get(url,headers=headers).text
data

結果如下:

結果分析:明明評論信息就是在這個頁面裏面,我們這樣請求,怎麼得不到數據呢?難道是沒有帶着cookies發送請求?我們接下來嘗試帶着cookies發送請求。

4、進行第二次請求測試

import pandas as pd
import requests
import re
import time

url = "https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.626d40c2tp5mYQ&id=43751299764&skuId=4493124079453&areaId=421300&user_id=2380958892&cat_id=2&is_b=1&rn=cc519a17bf9cefb59ac94f0351791648"
headers ={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
data = requests.get(url,headers=headers).text
data

結果如下:

結果分析:不科學哈!這次我已經帶着cookies發送了請求呀,爲什麼還是獲取不到我們想要的數據,會不會“評論數據”根本就不再這個url中呢?那麼真正的true_url究竟在哪裏呢?下面我們慢慢解密。

5、怎麼找到真正的true_url?

1)點擊【鼠標右鍵】–>點擊【檢查】

2)點擊【Network】

3)刷新網頁

刷新網頁以後,可以發現【紅色方框】中,多了很多請求的url。

4)點擊【搜索按鈕】,進行評論數據搜索,尋找trul_url

  當出現如下界面後,按照如圖所示操作即可。

  緊接着,查看該請求所對應的Request URL,就是我們最終要找的

true_url。信不信嗎?下面可以試試。

6、進行第三次請求測試

  首先我們在上述圖的基礎上,順着Request URL往下面找,獲取Request Headers中user-agent、referer、cookie這3樣東西。

  反正都在Request Headers中,我們將這3樣東西,一一粘貼到headers中,形成一個字典格式的鍵值對。然後我們發起其三次請求。

true_url = "https://rate.tmall.com/list_detail_rate.htm?itemId=43751299764&spuId=864684242&sellerId=2380958892&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&groupId=&ua=098%23E1hvmvvPvBvvUvCkvvvvvjiPn25UQjlHnLs9ljD2PmPUtjEmPFsUzjiUPsFh0jYR9phv2nsGdj2qzYswMjBt7u6CvvDvpiQZN9CC0Jujvpvhphhvv2yCvvBvpvvvKphv8hCvvvvvvhjPphvhqvvvpkxvpCBXvvC2p6CvHHyvvh84phvWipvvpS0EvpvVpyUUCCQOuphvmhCvCW780nVlmphvLhm6DQmFdcHmjobWlCkfJy3Qp%2BoQRqwiL7CpqU0QKoZHaysEDLuTWD19C7zhdixdBAyZgn94e7Q4b64B9CkaU6UsxI2wjLyDZLxjKOvCvpvVphhvvvvv2QhvCvvvMM%2F5vpvhphvhH86CvCHUooppwvCvws1B34ZzKsELW86CvvDvp3%2BpDQCCTzurvpvEphHi7WWvpORURphvChCvvvv%3D&needFold=0&_ksTS=1585207007017_726&callback=jsonp727"
headers ={
    # 用的哪個瀏覽器
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
    # 從哪個頁面發出的數據申請,每個網站可能略有不同
    'referer': 'https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.744840c2FKDkFG&id=43751299764&skuId=4493124079453&areaId=421300&user_id=2380958892&cat_id=2&is_b=1&rn=388ceadeefb8d85e5bae2d83bd0b732a',
    # 哪個用戶想要看數據,是遊客還是註冊用戶,建議使用登錄後的cookie
    'cookie': 'tk_trace=1; cna=qzxtFlkIdkICARsvgIh8ftNm; t=972672ef4a0555634bb4c53147d9c209; _tb_token_=f9ed83467e7ab; cookie2=11c397b08781b52815002215ea5d1ad4; dnk=huang%5Cu81F3%5Cu5C0A; tracknick=huang%5Cu81F3%5Cu5C0A; lid=huang%E8%87%B3%E5%B0%8A; lgc=huang%5Cu81F3%5Cu5C0A; uc1=cookie16=UIHiLt3xCS3yM2h4eKHS9lpEOw%3D%3D&pas=0&existShop=false&cookie15=UtASsssmOIJ0bQ%3D%3D&cookie14=UoTUP2D4F2IHjA%3D%3D&cookie21=VFC%2FuZ9aiKCaj7AzMHh1; uc3=id2=UU8BrRJJcs7Z0Q%3D%3D&lg2=VT5L2FSpMGV7TQ%3D%3D&vt3=F8dBxd9hhEzOWS%2BU9Dk%3D&nk2=CzhMCY1UcRnL; _l_g_=Ug%3D%3D; uc4=id4=0%40U22GV4QHIgHvC14BqrCleMrzYb3K&nk4=0%40CX8JzNJ900MInLAoQ2Z33x1zsSo%3D; unb=2791663324; cookie1=BxeNCqlvVZOUgnKrsmThRXrLiXfQF7m%2FKvrURubODpk%3D; login=true; cookie17=UU8BrRJJcs7Z0Q%3D%3D; _nk_=huang%5Cu81F3%5Cu5C0A; sgcookie=E53NoUsJWtrYT7Pyx14Px; sg=%E5%B0%8A41; csg=8d6d2aae; enc=VZMEO%2BOI3U59DBFwyF9LE3kQNM84gfIKeZFLokEQSzC5TubpmVCJlS8olhYmgHiBe15Rvd8rsOeqeC1Em9GfWA%3D%3D; l=dBLKMV6rQcVJihfaBOfgSVrsTkQ9UIRb8sPrQGutMICP9ZCwNsyFWZ4Kb-8eCnGVHsMvR3oGfmN0BDTHXyIVokb4d_BkdlkmndC..; isg=BK2tcrfNj3CNMWubo5GaxlajvEknCuHcPbxLgO-yO8QhZswYt1ujrPVwUDqAZvmU'
}
data = requests.get(true_url,headers=headers).text
data

結果如下:

結果分析:經過一番波折,我們最終找到了我們想要獲取的數據,接下來的話,就是我們進行頁面解析的工作了。

其實在真實的爬蟲環境中,可能會遇到更多的反爬措施,真正難得不是解析網頁,而是分析網頁和反爬。

7、獲取網頁中的評論數據

result = re.findall('rateContent":"(.*?)"fromMall"',data)
result

結果如下:

8、翻頁爬取(最終代碼)

  我們的目的肯定不只是爬取一個頁面的評論數據,而是進行翻頁爬取,我們需要仔細觀察true_url中,有一個【currentPage=1】參數,當這個數字變化的時候,對應的頁面也就發生的變化,基於此,我們將完整的爬蟲代碼寫在下面。

import pandas as pd
import requests
import re
import time

data_list = []

for i in range(1,300,1):
    print("正在爬取第" + str(i) + "頁")
    url = first + str(i) + last
    headers ={
        # 用的哪個瀏覽器
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36',
        # 從哪個頁面發出的數據申請,每個網站可能略有不同
        'referer': 'https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.744840c2FKDkFG&id=43751299764&skuId=4493124079453&areaId=421300&user_id=2380958892&cat_id=2&is_b=1&rn=388ceadeefb8d85e5bae2d83bd0b732a',
        # 哪個用戶想要看數據,是遊客還是註冊用戶,建議使用登錄後的cookie
        'cookie': 'tk_trace=1; cna=qzxtFlkIdkICARsvgIh8ftNm; t=972672ef4a0555634bb4c53147d9c209; _tb_token_=f9ed83467e7ab; cookie2=11c397b08781b52815002215ea5d1ad4; dnk=huang%5Cu81F3%5Cu5C0A; tracknick=huang%5Cu81F3%5Cu5C0A; lid=huang%E8%87%B3%E5%B0%8A; lgc=huang%5Cu81F3%5Cu5C0A; uc1=cookie16=UIHiLt3xCS3yM2h4eKHS9lpEOw%3D%3D&pas=0&existShop=false&cookie15=UtASsssmOIJ0bQ%3D%3D&cookie14=UoTUP2D4F2IHjA%3D%3D&cookie21=VFC%2FuZ9aiKCaj7AzMHh1; uc3=id2=UU8BrRJJcs7Z0Q%3D%3D&lg2=VT5L2FSpMGV7TQ%3D%3D&vt3=F8dBxd9hhEzOWS%2BU9Dk%3D&nk2=CzhMCY1UcRnL; _l_g_=Ug%3D%3D; uc4=id4=0%40U22GV4QHIgHvC14BqrCleMrzYb3K&nk4=0%40CX8JzNJ900MInLAoQ2Z33x1zsSo%3D; unb=2791663324; cookie1=BxeNCqlvVZOUgnKrsmThRXrLiXfQF7m%2FKvrURubODpk%3D; login=true; cookie17=UU8BrRJJcs7Z0Q%3D%3D; _nk_=huang%5Cu81F3%5Cu5C0A; sgcookie=E53NoUsJWtrYT7Pyx14Px; sg=%E5%B0%8A41; csg=8d6d2aae; enc=VZMEO%2BOI3U59DBFwyF9LE3kQNM84gfIKeZFLokEQSzC5TubpmVCJlS8olhYmgHiBe15Rvd8rsOeqeC1Em9GfWA%3D%3D; l=dBLKMV6rQcVJihfaBOfgSVrsTkQ9UIRb8sPrQGutMICP9ZCwNsyFWZ4Kb-8eCnGVHsMvR3oGfmN0BDTHXyIVokb4d_BkdlkmndC..; isg=BK2tcrfNj3CNMWubo5GaxlajvEknCuHcPbxLgO-yO8QhZswYt1ujrPVwUDqAZvmU'
    }
    try:
        data = requests.get(url,headers = headers).text
        time.sleep(10)
        result = re.findall('rateContent":"(.*?)"fromMall"',data)
        data_list.extend(result)
    except:
        print("本頁爬取失敗")
df = pd.DataFrame()
df["評論"] = data_list
df.to_excel("評論_彙總.xlsx")

結果如下:

9、詞雲圖的製作

import numpy as np
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from imageio import imread

import warnings
warnings.filterwarnings("ignore")

# 讀取數據
df = pd.read_excel("評論_彙總.xlsx")
df.head()
# 利用jieba進行分析操作
df["評論"] = df["評論"].apply(jieba.lcut)
df.head()
# 去除停用詞操作
with open("stopword.txt","r",encoding="gbk") as f:
    stop = f.read()  # 返回的是一個字符串
    
stop = stop.split()  # 這裏得到的是一個列表.split()會將空格,\n,\t進行切分,因此我們可以將這些加到停用詞當中
stop = stop + [" ","\n","\t"]
df_after = df["評論"].apply(lambda x: [i for i in x if i not in stop])
df_after.head()
# 詞頻統計
all_words = []
for i in df_after:
    all_words.extend(i)

word_count = pd.Series(all_words).value_counts()
word_count[:10]
# 繪製詞雲圖
# 1、讀取背景圖片
back_picture = imread(r"G:\6Tipdm\wordcloud\alice_color.png")
# 2、設置詞雲參數
wc = WordCloud(font_path="G:\\6Tipdm\\wordcloud\\simhei.ttf",
               background_color="white",
               max_words=2000,
               mask=back_picture,
               max_font_size=200,
               random_state=42
              )
wc2 = wc.fit_words(word_count)
# 3、繪製詞雲圖
plt.figure(figsize=(16,8))
plt.imshow(wc2)
plt.axis("off")
plt.show()
wc.to_file("ciyun.png")

結果如下:

歡迎掃描二維碼關注黃同學的CSDN博客


近期文章,點擊圖片即可查看

後臺回覆關鍵詞「進羣」,即刻加入讀者交流羣~

黃問我,大家最近都喜歡看什麼?

我說爬蟲啊、數據分析案例、最好吸引人的,

沒想到他就寫了杜蕾斯的爬蟲

不知道你們喜不喜歡?

三連走一波~

朱小五

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章