文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html
做者: shenzhongqiangnode
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取ajax
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cefjson
微信
第一步,咱們先從京東商城爬取全部在售的手機數據。這裏咱們關心的主要是價格和配置信息,商品頁面上的價格和配置信息像下面兩張圖所示
網絡
咱們編寫代碼爬取全部手機的價格和配置信息,爬蟲的核心代碼以下函數
1 # 獲取手機單品的價格 2 def get_price(skuid): 3 url = "https://c0.3.cn/stock?skuId=" + str(skuid) + "&area=1_72_4137_0&venderId=1000004123&cat=9987,653,655&buyNum=1&choseSuitSkuIds=&extraParam={%22originid%22:%221%22}&ch=1&fqsp=0&pduid=15379228074621272760279&pdpin=&detailedAdd=null&callback=jQuery3285040" 4 r = requests.get(url, verify=False) 5 content = r.content.decode('GBK') 6 matched = re.search(r'jQuery\d+\((.*)\)', content, re.M) 7 if matched: 8 data = json.loads(matched.group(1)) 9 price = float(data["stock"]["jdPrice"]["p"]) 10 return price 11 return 0 12 13 # 獲取手機的配置信息 14 def get_item(skuid, url): 15 price = get_price(skuid) 16 r = requests.get(url, verify=False) 17 content = r.content 18 root = etree.HTML(content) 19 nodes = root.xpath('.//div[@class="Ptable"]/div[@class="Ptable-item"]') 20 params = {"price": price, "skuid": skuid} 21 for node in nodes: 22 text_nodes = node.xpath('./dl')[0] 23 k = "" 24 v = "" 25 for text_node in text_nodes: 26 if text_node.tag == "dt": 27 k = text_node.text 28 elif text_node.tag == "dd" and "class" not in text_node.attrib: 29 v = text_node.text 30 params[k] = v 31 return params 32 33 # 獲取一個頁面中的全部手機信息 34 def get_cellphone(page): 35 url = "https://list.jd.com/list.html?cat=9987,653,655&page={}&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=4#J_main".format(page) 36 r = requests.get(url, verify=False) 37 content = r.content.decode("utf-8") 38 root = etree.HTML(content) 39 cell_nodes = root.xpath('.//div[@class="p-img"]/a') 40 client = pymongo.MongoClient() 41 db = client[DB] 42 for node in cell_nodes: 43 item_url = fix_url(node.attrib["href"]) 44 matched = re.search('item.jd.com/(\d+)\.html', item_url) 45 skuid = int(matched.group(1)) 46 saved = db.items.find({"skuid": skuid}).count() 47 if saved > 0: 48 print(saved) 49 continue 50 item = get_item(skuid, item_url) 51 # 結果存入MongoDB 52 db.items.insert(item)
須要注意的是,上面的get_price和get_item函數分別從兩個url獲取數據,這是由於配置信息能夠直接從商品頁面中解析獲得,而價格信息須要從另一個ajax請求裏得到。爬下來的全部數據存入MongoDB。性能
爬下來的手機數據當中,信息完整的共有4700多條數據,這4700多部手機屬於70個手機品牌。 這些品牌畫成詞雲圖是這樣的學習
手機的配置主要有如下這些參數ui
是否雙卡雙待
機身材質
CPU型號
內存大小
存儲容量
電池容量
屏幕材質
屏幕大小
分辨率
攝像頭
平時用手機主要是看看書、刷刷知乎微信、買買東西,因此選購新手機的時候最關心的就是速度、容量、待機時間這幾項,對攝像頭、屏幕材質倒不是特別在意。考慮以上因素,在對數據作過濾的時候,我設定了如下幾個條件
CPU的品牌是高通
內存大小大於等於6GB
存儲容量大於等於64GB
電池容量大於3000mAh
必須是雙卡雙待
價格在1500元之內
過濾數據的代碼以下
1 client = pymongo.MongoClient() 2 db = client[DB] 3 items = db.items.find({}) 4 result = preprocess(items) 5 df = pd.DataFrame(result) 6 df_res = df[df.cpu_brand=="驍龍(Snapdragon)"][df.battery_cap >= 3000][df.rom >= 64][df.ram >= 6][df.dual_sim == True][df.price<=1500] 7 print(df_res[["brand", "model", "color", "cpu_brand", "cpu_freq", "cpu_core", "cpu_model", "rom", "ram", "battery_cap", "price"]].sort_values(by="price"))
首先從MongoDB裏讀取數據,而後建立DataFrame,對DataFrame裏的數據按照上面的條件做選擇。代碼的最後一行將篩選出來的手機打印出來,並按價格從低到高排序。
通過了這樣一輪篩選後,咱們獲得了下面的38款手機
上面的幾部手機配置都比較接近,可是網上對小米的評價廣泛比較高,因而又在上面的列表裏篩選出了全部的小米手機,獲得下面7款