前言
- 最近閒來無事,又正好在學習Python數據分析統計,於是便萌生一種想法:統計京東購買記錄,分析全國女性平均Size
準備工作
- 首先查詢京東網站,輸入查詢內容xz,查到87萬+商品
- 購買size可以在評論區找到(就擺在那兒,那也太簡單了,後面才知道我想多了。。。)
- 先看域名,發現每一個域名的構成都是https://item.jd.com/然後加一串數字.html,經驗告訴我,這串數字一定是商品id。
- 找id的話就要到搜索頁面找了,果然,在分析搜索頁面之後,發現id就躺在靜態頁面中。
- 思路有了,準備寫代碼。。。
開始碼代碼
- 第一步當然是獲取id了,通過分析搜索域名(不得不說jd的反爬機制,唉,這裏不好評價,自行體會,分析過程如下。)
- 需要注意的就是keyword,wq(全拼),還有後面的page和s,這幾個參數是改變的
keyword傳入商品名稱,wq傳入商品全拼,page傳入商品頁(jd是按照奇數排序),s的話,需要計算,見代碼。
#爬取商品id
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0'}
def get_id(key_word,wq):
#jd_url='https://search.jd.com/Search?keyword=%E5%A5%B3%E6%80%A7%E5%86%85%E8%A1%A3&enc=utf-8&wq=%E5%A5%B3%E6%80%A7nei%27yi&pvid=fafd7af082734ae1a4a6cb674f98b2e4'
jd_url = 'https://search.jd.com/Search'
product_ids = []
# 爬前3頁的商品
j = 51;
for i in range(17,25,2):
param = {'keyword': key_word, 'enc': 'utf-8', 'qrst':'1', 'rt':1, 'stop':1, 'vt':2, 'wq':wq, 'page':i, 's':j, 'click':0}
response = requests.get(jd_url,params = param,headers=headers)
# 商品id
ids = re.findall('data-pid="(.*?)"', response.text,re.S)
product_ids += ids
if i!= 3:
j = j+50+i-4;
else:
j+=50
return product_ids
- 獲取id之後我們進入頁面,準備獲取評價裏的購買尺寸,用靜態網站方法爬一下,正則表達式分析一手,發現根本無法獲得購買尺寸,再一看,獲取的html頁面中根本沒有評價內容,經驗告訴我這是通過json接口傳入的。
- 於是,就開始了我的找接口。。。。(此處省略兩個小時)
- 在我的不懈努力下,終於找到了接口。。。
- 下面分析接口url(也不難)。
- 分析並不難,直接上代碼,這次沒有用params的參數,而是用的字符串拼接,因爲params一直報錯,搞了好久。
#爬取Size
def getSizes(ids):
Sizes = []
for id in ids:
for i in range(0,8):
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId='+id+'&score=0&sortType=5&page='+str(i)+'&pageSize=10&isShadowSku=0&fold=1'
response = requests.get(url)
size = re.findall('"productSize":"(.*?)"',response.text)
Sizes+=size
return Sizes
- 爬取Size後,發現Size並不統一,有的用XXL,有的用ABC,所以需要清洗一下獲取的數據,如下
#數據清洗(統一尺碼)
def unified(str):
if 'E' in str:
return 'E'
if 'D' in str:
return 'D'
if 'C' in str:
return 'C'
if 'B' in str:
return 'B'
if 'A' in str:
return 'A'
if 'XXL' in str:
return 'E'
if 'XL' in str:
return 'D'
if 'L' in str:
return 'C'
if 'M' in str:
return 'B'
if 'S' in str:
return 'A'
if '均碼' in str:
return 'B'
if '大' in str:
return 'C'
if '小' in str:
return 'A'
- 搞定這一切後,想要對Size進行分析,但是我感覺直接在PyCharm裏面分析有點難看,好吧,主要是想用上最近學的juty notebook。於是我便把獲取到的數據先寫入MySQL,再轉到juty notebook進行分析。
#運行並寫入數據庫
conn = pymysql.connect(host='localhost',user='root',password='123',database='size',port=3306) #連接數據庫
cursor = conn.cursor()
ids = get_id("胸罩","xiong'zhao") #獲取id
Sizes = getSizes(ids) #獲取sizes
Sizes_flush = []
for size in Sizes: #清洗Sizes
if unified(size) is not None:
Sizes_flush+=unified(size)
sql = "INSERT INTO jd_size(size) values('" + unified(size) + "');"
cursor.execute(sql) #入庫
conn.commit()
開始分析
- 首先連接數據庫並讀入數據
- 然後對獲取到的數據進行分類彙總
- 彙總之後就明顯可以看出來,B佔大多數了,然後開始繪製一下餅圖。
- 果然,B佔一半以上,接下來再繪製一下直方圖。
很直觀是不是?最後送大家一套2020最有趣的Pyhon項目實戰視頻教程,點我進來獲取,跟着練習下,希望大家一起進步哦!
至此,我們的分析項目就完成了,經統計,全國女性大多爲B杯。
完整項目代碼見https://github.com/lrffun/My_Python/tree/master/Size