前言:
今天再帶大家簡單爬一波京東的商品數據唄,廢話不多說,讓我們愉快地開始吧~
效果

開發工具
Python版本:3.6.4
相關模塊:
DecryptLogin模塊;
argparse模塊;
以及一些python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
原理簡介
原理其實挺簡單的,首先,我們利用之前開源的DecryptLogin庫來實現一下微博的模擬登錄操作:
'''模擬登錄京東'''
@staticmethod
def login():
lg = login.Login()
infos_return, session = lg.jingdong()
return session
然后寫幾行簡單的代碼來保存一下登錄后的會話,省得每次運行程序都要先模擬登錄京東:
if os.path.isfile('session.pkl'):
print('[INFO]: 檢測到已有會話文件session.pkl, 將直接導入該文件...')
self.session = pickle.load(open('session.pkl', 'rb'))
self.session.headers.update({'Referer': ''})
else:
self.session = JDGoodsCrawler.login()
f = open('session.pkl', 'wb')
pickle.dump(self.session, f)
f.close()
接着去京東抓一波包,一樣的套路,有種屢試不爽的感覺:

看看請求這個接口需要提交的參數:

我們可以簡單分析一下每個參數的含義:
area: 不用管,可以看作一個固定值
enc: 指定編碼, 可以看作固定值"utf-8"
keyword: 搜索的關鍵詞
adType: 不用管,可以看作一個固定值
page: 當前的頁碼
ad_ids: 不用管,可以看作一個固定值
xtest: 不用管,可以看作一個固定值
_: 時間戳
也就是說我們需要提交的params的內容大概是這樣子的:
params = {
'area': '15',
'enc': 'utf-8',
'keyword': goods_name,
'adType': '7',
'page': str(page_count),
'ad_ids': '291:19',
'xtest': 'new_search',
'_': str(int(time.time()*1000))
}
構造好需要提交的params之后,只需要利用登錄后的session去請求我們抓包得到的接口:
response = self.session.get(search_url, params=params)
然后從返回的數據里解析並提取我們需要的數據就可以了:
response_json = response.json()
all_items = response_json.get('291', [])
for item in all_items:
goods_infos_dict.update({len(goods_infos_dict)+1:
{
'image_url': item.get('image_url', ''),
'price': item.get('pc_price', ''),
'shop_name': item.get('shop_link', {}).get('shop_name', ''),
'num_comments': item.get('comment_num', ''),
'link_url': item.get('link_url', ''),
'color': item.get('color', ''),
'title': item.get('ad_title', ''),
'self_run': item.get('self_run', ''),
'good_rate': item.get('good_rate', '')
}
})
數據可視化
老規矩,可視化一波我們爬取到的數據唄。以我們爬取到的無人機商品數據為例。首先,我們來看看京東里賣無人機的自營店和非自營店比例:

咦,竟然是非自營店占多。我一直以為京東基本都是自營店,雖然我基本不用京東。真是個天大的誤解。
接着,我們再來看看京東自己給的商品排名前10的那幾家店的商品評論數量:

對比一下評論最多的店鋪:

看來評論數量和京東給的商品排名並沒有直接聯系T_T,竟然沒有一家店是重復的。
再來看看無人機相關商品的價格分布:

文章到這里就結束了,感謝你的觀看,Python模擬登錄系列系列,下篇文章分享刪除批量微博。
