成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

分析了京東內(nèi)衣銷售記錄,告訴你妹子們的真Size!

Coly / 1455人閱讀

摘要:今天閑暇之余寫了一個(gè)爬蟲例子。后兩個(gè)為分頁參數(shù),是每個(gè)商品的,通過這個(gè)去獲取商品的評(píng)價(jià)記錄,所以我們只需要知道每個(gè)商品的就輕而易舉的獲取評(píng)價(jià)了。大概了解了整個(gè)流程,就可以開始我們的爬蟲工作了。

今天閑暇之余寫了一個(gè)爬蟲例子。通過爬蟲去爬取京東的用戶評(píng)價(jià),通過分析爬取的數(shù)據(jù)能得到很多結(jié)果,比如,哪一種顏色的胸罩最受女性歡迎,以及中國女性的平均size(僅供參考哦~)

打開開發(fā)者工具-network,在用戶評(píng)價(jià)頁面我們發(fā)現(xiàn)瀏覽器有這樣一個(gè)請求

通過分析我們發(fā)現(xiàn)主要用的參數(shù)有三個(gè)productId,page,pageSize。后兩個(gè)為分頁參數(shù),productId是每個(gè)商品的id,通過這個(gè)id去獲取商品的評(píng)價(jià)記錄,所以我們只需要知道每個(gè)商品的productId就輕而易舉的獲取評(píng)價(jià)了。再來分析搜索頁面的網(wǎng)頁源代碼

通過分析我們發(fā)現(xiàn)每個(gè)商品都在li標(biāo)簽中,而li標(biāo)簽又有一個(gè)data-pid屬性,這個(gè)對(duì)應(yīng)的值就是商品的productId了。

大概了解了整個(gè)流程,就可以開始我們的爬蟲工作了。


首先我們需要在搜索頁面獲取商品的id,為下面爬取用戶評(píng)價(jià)提供productId。key_word為搜索的關(guān)鍵字,這里就是【胸罩】

import requests
import re

"""
查詢商品id
"""
def find_product_id(key_word):
    jd_url = "https://search.jd.com/Search"
    product_ids = []
    # 爬前3頁的商品
    for i in range(1,4):
        param = {"keyword": key_word, "enc": "utf-8", "page": i}
        response = requests.get(jd_url, params=param)
        # 商品id
        ids = re.findall("data-pid="(.*?)"", response.text, re.S)
        product_ids += ids
    return product_ids

將前三頁的商品id放入列表中,接下來我們就可以爬取評(píng)價(jià)了

我們通過分析preview發(fā)現(xiàn)獲取用戶評(píng)價(jià)這個(gè)請求響應(yīng)的格式是一個(gè)字符串后面拼接了一個(gè)json(如下圖),所以我們只要將無用的字符刪除掉,就可以獲取到我們想要的json對(duì)象了。

而在json對(duì)象中的comments的內(nèi)容就是我們最終想要的評(píng)價(jià)記錄

"""
獲取評(píng)論內(nèi)容
"""
def get_comment_message(product_id):
    urls = ["https://sclub.jd.com/comment/productPageComments.action?" 
            "callback=fetchJSON_comment98vv53282&" 
            "productId={}" 
            "&score=0&sortType=5&" 
            "page={}" 
            "&pageSize=10&isShadowSku=0&rid=0&fold=1".format(product_id, page) for page in range(1, 11)]
    for url in urls:
        response = requests.get(url)
        html = response.text
        # 刪除無用字符
        html = html.replace("fetchJSON_comment98vv53282(", "").replace(");", "")
        data = json.loads(html)
        comments = data["comments"]
        t = threading.Thread(target=save_mongo, args=(comments,))
        t.start()

在這個(gè)方法中只獲取了前10頁的評(píng)價(jià)的url,放到urls這個(gè)列表中。通過循環(huán)獲取不同頁面的評(píng)價(jià)記錄,這時(shí)啟動(dòng)了一個(gè)線程用來將留言數(shù)據(jù)存到到MongoDB中。

我們繼續(xù)分析評(píng)價(jià)記錄這個(gè)接口發(fā)現(xiàn)我們想要的兩條數(shù)據(jù)

productColor:產(chǎn)品顏色

productSize:產(chǎn)品尺寸

# mongo服務(wù)
client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
# jd數(shù)據(jù)庫
db = client.jd
# product表,沒有自動(dòng)創(chuàng)建
product_db = db.product

#  保存mongo
def save_mongo(comments):
    for comment in comments:
        product_data = {}
        # 顏色
        # flush_data清洗數(shù)據(jù)的方法
        product_data["product_color"] = flush_data(comment["productColor"])
        # size
        product_data["product_size"] = flush_data(comment["productSize"])
        # 評(píng)論內(nèi)容
        product_data["comment_content"] = comment["content"]
        # create_time
        product_data["create_time"] = comment["creationTime"]
        # 插入mongo
        product_db.insert(product_data)

因?yàn)槊糠N商品的顏色、尺寸描述上有差異,為了方面統(tǒng)計(jì),我們進(jìn)行了簡單的數(shù)據(jù)清洗。這段代碼非常的不Pythonic。不過只是一個(gè)小demo,大家無視即可。

def flush_data(data):
    if "膚" in data:
        return "膚色"
    if "黑" in data:
        return "黑色"
    if "紫" in data:
        return "紫色"
    if "粉" in data:
        return "粉色"
    if "藍(lán)" in data:
        return "藍(lán)色"
    if "白" in data:
        return "白色"
    if "灰" in data:
        return "灰色"
    if "檳" in data:
        return "香檳色"
    if "琥" in data:
        return "琥珀色"
    if "紅" in data:
        return "紅色"
    if "紫" in data:
        return "紫色"
    if "A" in data:
        return "A"
    if "B" in data:
        return "B"
    if "C" in data:
        return "C"
    if "D" in data:
        return "D"

這幾個(gè)模塊的功能編寫完畢,下面只需要將他們聯(lián)系起來

# 創(chuàng)建一個(gè)線程鎖
lock = threading.Lock()

# 獲取評(píng)論線程
def spider_jd(ids):
    while ids:
        # 加鎖
        lock.acquire()
        # 取出第一個(gè)元素
        id = ids[0]
        # 將取出的元素從列表中刪除,避免重復(fù)加載
        del ids[0]
        # 釋放鎖
        lock.release()
        # 獲取評(píng)論內(nèi)容
        get_comment_message(id)


product_ids = find_product_id("胸罩")
for i in (1, 5):
    # 增加一個(gè)獲取評(píng)論的線程
    t = threading.Thread(target=spider_jd, args=(product_ids,))
    # 啟動(dòng)線程
    t.start()

上面代碼加鎖的原因是為了防止重復(fù)消費(fèi)共享變量

運(yùn)行之后的查看MongoDB:

得到結(jié)果之后,為了能更直觀的表現(xiàn)數(shù)據(jù),我們可以用matplotlib庫進(jìn)行圖表化展示

import pymongo
from pylab import *


client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
# jd數(shù)據(jù)庫
db = client.jd
# product表,沒有自動(dòng)創(chuàng)建
product_db = db.product
# 統(tǒng)計(jì)以下幾個(gè)顏色
color_arr = ["膚色", "黑色", "紫色", "粉色", "藍(lán)色", "白色", "灰色", "香檳色", "紅色"]

color_num_arr = []
for i in color_arr:
    num = product_db.count({"product_color": i})
    color_num_arr.append(num)

# 顯示的顏色
color_arr = ["bisque", "black", "purple", "pink", "blue", "white", "gray", "peru", "red"]

#labeldistance,文本的位置離遠(yuǎn)點(diǎn)有多遠(yuǎn),1.1指1.1倍半徑的位置
#autopct,圓里面的文本格式,%3.1f%%表示小數(shù)有三位,整數(shù)有一位的浮點(diǎn)數(shù)
#shadow,餅是否有陰影
#startangle,起始角度,0,表示從0開始逆時(shí)針轉(zhuǎn),為第一塊。一般選擇從90度開始比較好看
#pctdistance,百分比的text離圓心的距離
#patches, l_texts, p_texts,為了得到餅圖的返回值,p_texts餅圖內(nèi)部文本的,l_texts餅圖外label的文本
patches,l_text,p_text = plt.pie(sizes, labels=labels, colors=colors,
                                labeldistance=1.1, autopct="%3.1f%%", shadow=False,
                                startangle=90, pctdistance=0.6)
#改變文本的大小
#方法是把每一個(gè)text遍歷。調(diào)用set_size方法設(shè)置它的屬性
for t in l_text:
    t.set_size=(30)
for t in p_text:
    t.set_size=(20)
# 設(shè)置x,y軸刻度一致,這樣餅圖才能是圓的
plt.axis("equal")
plt.title("內(nèi)衣顏色比例圖", fontproperties="SimHei") #
plt.legend()
plt.show()

運(yùn)行代碼,我們發(fā)現(xiàn)膚色的最受歡迎 其次是黑色 (鋼鐵直男表示不知道是不是真的...)

接下來我們再來統(tǒng)計(jì)一下size 的分布圖,這里用柱狀圖進(jìn)行顯示

index=["A","B","C","D"]

client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
db = client.jd
product_db = db.product

value = []
for i in index:
    num = product_db.count({"product_size": i})
    value.append(num)

plt.bar(left=index, height=value, color="green", width=0.5)

plt.show()

運(yùn)行后我們發(fā)現(xiàn) B size的女性更多一些


最后,歡迎大家關(guān)注我的公眾號(hào)(python3xxx)。每天都會(huì)推送不一樣的Python干貨。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45241.html

相關(guān)文章

  • node爬蟲:送一大波美腿圖

    摘要:決定送大家一套美圖。美腿可以分為白璧無瑕的大腿美晶瑩剔透的小腿美細(xì)微的美足健康明朗的腿形美。所謂腿健美,是指腿部的線條美。腿的長短與肥瘦是決定腿部美丑的兩大因素。 決定送大家一套美圖。但是授之以魚不如授之以漁,我們就來使用node實(shí)現(xiàn)個(gè)小爬蟲去爬取各種美女 來吧,我們先來看看今天的目標(biāo): mmjpg.com的美腿頻道下的圖片 showImg(https://segmentfault.c...

    i_garfileo 評(píng)論0 收藏0
  • web語義化之SEO和ARIA

    摘要:在快速理解語義化的時(shí)候,只知道語義化有利于和便于屏幕閱讀器閱讀,但并不知道它是如何有利于和便于閱讀器閱讀的,帶著這個(gè)疑問,進(jìn)行了一番探索總結(jié)。年月日,工作組發(fā)布了在中使用的標(biāo)準(zhǔn)工作草案。 在快速理解web語義化的時(shí)候,只知道web語義化有利于SEO和便于屏幕閱讀器閱讀,但并不知道它是如何有利于SEO和便于閱讀器閱讀的,帶著這個(gè)疑問,進(jìn)行了一番探索總結(jié)。 SEO 什么是SEO? SEO(...

    Riddler 評(píng)論0 收藏0
  • web語義化之SEO和ARIA

    摘要:在快速理解語義化的時(shí)候,只知道語義化有利于和便于屏幕閱讀器閱讀,但并不知道它是如何有利于和便于閱讀器閱讀的,帶著這個(gè)疑問,進(jìn)行了一番探索總結(jié)。年月日,工作組發(fā)布了在中使用的標(biāo)準(zhǔn)工作草案。 在快速理解web語義化的時(shí)候,只知道web語義化有利于SEO和便于屏幕閱讀器閱讀,但并不知道它是如何有利于SEO和便于閱讀器閱讀的,帶著這個(gè)疑問,進(jìn)行了一番探索總結(jié)。 SEO 什么是SEO? SEO(...

    gxyz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<