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

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

黃偉呢 凹凸數據json

你們好,我是黃同窗圖片瀏覽器

據說你們最近對爬蟲感興趣,因此今天手把手帶你爬天貓。cookie

爬蟲爬什麼呢?app

由於海報出圈的杜蕾斯,真的是家喻戶曉。dom

不如就它吧ide

一、登陸天貓網站

  對於有些網站,須要登錄後纔有可能獲取到網頁中的數據。天貓網站就是其中的網站之一。
手把手帶你爬天貓,獲取杜蕾斯評論數據svg

二、搜索指定網頁

  這裏我想要爬取的是杜蕾斯。所以咱們直接搜索「杜蕾斯」。因爲「杜蕾斯」的賣家有不少,這裏咱們只選取頁面的第一個圖片,進行其中的「評論數據」的爬取。oop

手把手帶你爬天貓,獲取杜蕾斯評論數據
 點擊第一個圖片,進入到咱們最終想要爬取數據的網頁。能夠看到該頁面有不少評論信息,這也是咱們想要抓取的信息。測試

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

三、進行第一次請求測試

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

結果以下:
手把手帶你爬天貓,獲取杜蕾斯評論數據jsonp

結果分析:明明評論信息就是在這個頁面裏面,咱們這樣請求,怎麼得不到數據呢?難道是沒有帶着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究竟在哪裏呢?下面咱們慢慢解密。

五、怎麼找到真正的true_url?

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

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

2)點擊【Network】
手把手帶你爬天貓,獲取杜蕾斯評論數據

3)刷新網頁

刷新網頁之後,能夠發現【紅色方框】中,多了不少請求的url。
手把手帶你爬天貓,獲取杜蕾斯評論數據

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

手把手帶你爬天貓,獲取杜蕾斯評論數據
  當出現以下界面後,按照如圖所示操做便可。

手把手帶你爬天貓,獲取杜蕾斯評論數據
  緊接着,查看該請求所對應的Request URL,就是咱們最終要找的
true_url。信不信嗎?下面能夠試試。
手把手帶你爬天貓,獲取杜蕾斯評論數據

六、進行第三次請求測試

  首先咱們在上述圖的基礎上,順着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

結果以下:
手把手帶你爬天貓,獲取杜蕾斯評論數據

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

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

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

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

結果以下:
手把手帶你爬天貓,獲取杜蕾斯評論數據

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

  咱們的目的確定不僅是爬取一個頁面的評論數據,而是進行翻頁爬取,咱們須要仔細觀察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")

結果以下:
手把手帶你爬天貓,獲取杜蕾斯評論數據

九、詞雲圖的製做

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]
# 繪製詞雲圖
# 一、讀取背景圖片
back_picture = imread(r"G:\6Tipdm\wordcloud\alice_color.png")
# 二、設置詞雲參數
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)
# 三、繪製詞雲圖
plt.figure(figsize=(16,8))
plt.imshow(wc2)
plt.axis("off")
plt.show()
wc.to_file("ciyun.png")

結果以下:
手把手帶你爬天貓,獲取杜蕾斯評論數據

相關文章
相關標籤/搜索