黃偉呢 凹凸數據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發送請求。
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究竟在哪裏呢?下面咱們慢慢解密。
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¤tPage=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")
結果以下: