要不一塊兒來寫個淘寶商品數據小爬蟲吧?mp.weixin.qq.comgit
很久沒給本身開源的模擬登陸庫添加爬蟲小案例了,週末就給你們帶來一個淘寶商品數據小爬蟲吧。順便按老規矩把抓取到的數據可視化一波。廢話很少說,讓咱們愉快地開始吧~github
Python版本:3.6.4 相關模塊: DecryptLogin模塊; pyecharts模塊; 以及一些Python自帶的模塊。
既然說了是模擬登陸相關的爬蟲小案例,首先天然是要實現一下淘寶的模擬登陸啦。這裏仍是利用咱們開源的DecryptLogin庫來實現,只需三行代碼便可:ajax
'''模擬登陸淘寶''' @staticmethod def login(): lg = login.Login() infos_return, session = lg.taobao() return session
另外,順便提一句,常常有人想讓我在DecryptLogin庫里加入cookies持久化功能。其實你本身多寫兩行代碼就能實現了:json
if os.path.isfile('session.pkl'): self.session = pickle.load(open('session.pkl', 'rb')) else: self.session = TBGoodsCrawler.login() f = open('session.pkl', 'wb') pickle.dump(self.session, f) f.close()
我真不想在這個庫裏添加這個功能,後面我卻是想添加一些其餘爬蟲相關的功能,這個以後再說吧。好的,偏題了,言歸正傳吧。接着,咱們去網頁版的淘寶抓一波包吧。好比F12打開開發者工具後,在淘寶的商品搜索欄裏隨便輸入點東西,就像這樣:api
全局搜索一下諸如search這樣的關鍵詞,能夠發現以下連接:cookie
看看它返回的數據是啥:session
看來應該沒錯了。另外,若是小夥伴們本身實戰的時候沒有找到這個接口api,能夠嘗試再點擊一下右上角的下一頁商品按鈕:echarts
這樣就確定能抓到這個請求接口啦。簡單測試一下,能夠發現儘管請求這個接口所需攜帶的參數看上去不少,但實際上必需要提交的參數只有兩個,即:dom
q: 商品名稱 s: 當前頁碼的偏移量
好啦,根據這個接口,以及咱們的測試結果,如今就能夠愉快地開始實現淘寶商品數據的抓取啦。具體而言,主代碼實現以下:工具
'''外部調用''' def run(self): search_url = 'https://s.taobao.com/search?' while True: goods_name = input('請輸入想要抓取的商品信息名稱: ') offset = 0 page_size = 44 goods_infos_dict = {} page_interval = random.randint(1, 5) page_pointer = 0 while True: params = { 'q': goods_name, 'ajax': 'true', 'ie': 'utf8', 's': str(offset) } response = self.session.get(search_url, params=params) if (response.status_code != 200): break response_json = response.json() all_items = response_json.get('mods', {}).get('itemlist', {}).get('data', {}).get('auctions', []) if len(all_items) == 0: break for item in all_items: if not item['category']: continue goods_infos_dict.update({len(goods_infos_dict)+1: { 'shope_name': item.get('nick', ''), 'title': item.get('raw_title', ''), 'pic_url': item.get('pic_url', ''), 'detail_url': item.get('detail_url', ''), 'price': item.get('view_price', ''), 'location': item.get('item_loc', ''), 'fee': item.get('view_fee', ''), 'num_comments': item.get('comment_count', ''), 'num_sells': item.get('view_sales', '') } }) print(goods_infos_dict) self.__save(goods_infos_dict, goods_name+'.pkl') offset += page_size if offset // page_size > 100: break page_pointer += 1 if page_pointer == page_interval: time.sleep(random.randint(30, 60)+random.random()*10) page_interval = random.randint(1, 5) page_pointer = 0 else: time.sleep(random.random()+2) print('[INFO]: 關於%s的商品數據抓取完畢, 共抓取到%s條數據...' % (goods_name, len(goods_infos_dict)))
就是這麼簡單,咱們已經大功告成啦。最後,咱們再來看下代碼的運行效果唄:
見:https://zhuanlan.zhihu.com/p/...
這裏咱們來可視化一波咱們抓到的奶茶數據唄。先來看看在淘寶上賣奶茶的商家在全國範圍內的數量分佈狀況唄:
沒想到啊,奶茶店鋪最多的地方居然是廣東。T_T
再來看看淘寶上賣奶茶的店鋪的銷量排名前10名唄:
以及淘寶上評論數量前10名的奶茶店鋪:
再看看在這些店鋪要運費和不要運費的商品比例唄:
最後,再看看奶茶相關商品的售價區間唄:
差很少今天就這樣唄。