要不一塊兒來寫個淘寶商品數據小爬蟲吧?

原文連接

要不一塊兒來寫個淘寶商品數據小爬蟲吧?​mp.weixin.qq.com圖標git

導語

很久沒給本身開源的模擬登陸庫添加爬蟲小案例了,週末就給你們帶來一個淘寶商品數據小爬蟲吧。順便按老規矩把抓取到的數據可視化一波。廢話很少說,讓咱們愉快地開始吧~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名的奶茶店鋪:

再看看在這些店鋪要運費和不要運費的商品比例唄:

最後,再看看奶茶相關商品的售價區間唄:

差很少今天就這樣唄。

相關文件

https://github.com/CharlesPika

相關文章
相關標籤/搜索