1. 程式人生 > >關於天貓(淘寶)評論爬蟲

關於天貓(淘寶)評論爬蟲

一、環境搭建

開發環境python2.7,開發工具pycharm。

關於python2.7環境搭建,使用搜索引擎搜尋“anaconda”,在anaconda官網下載python版本,有兩個版本可供選擇,分別是anaconda2(python2)和anaconda3(python3),建議選擇anaconda3,由於發展必須,python2.7終究要被淘汰,由於本人電腦只安裝anaconda2,故用python2.7進行開發。

在這裡說一下選擇anaconda的理由,anaconda中集成了大部分python中常用的庫,可以在使用的時候直接進行呼叫,不必重新進行安裝,故選擇anaconda。對於anaconda的下載及安裝不在贅述,各大搜索引擎中均可搜到詳細安裝過程。

pycharm作為python專用開發工具,其好處自然不必多說,例如可以隨時終止/暫停程序、各種強大的提示功能(錯誤提示、變數是否用到等等)、索引功能很強等,當然也可以使用其他的開發工具,例如sublime等。本文使用pycharm作為開發工具。

二、爬蟲入門

網路爬蟲(又稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的成為網頁追逐者),是一種按照一定的規則,自動的抓取全球資訊網資訊的程式或指令碼。另外一些補償使用的名字還有螞蟻、自動索引、模擬程式或者蠕蟲。【引用自:點選開啟連結

以上是對網路爬蟲的簡單介紹,接下來介紹網路爬蟲經常使用的庫。

1、requests庫

2、beautifulsoup庫

3、json庫

4、random庫

5、re庫

6、MySQLdb庫(用於將資料存到mysql資料庫)

注:這些庫的介紹網上太多了,讀者可自行搜尋。

三、對於天貓的網路爬蟲

說了很多,終於回到主題,接下來對天貓中商品使用者評論進行爬蟲,為什麼不說淘寶呢,請看標題四、所遇到的問題

首先介紹爬蟲思路:

(1)從搜尋欄開始,找到相關的url地址,此時需要“F12”,進入開發者工具,在Network中尋找相關url(此過程務必仔細);

(2)找到儲存資訊的url之後,爬取資訊;

(3)將資訊存入資料庫;

(4)大功告成。

其實爬蟲是個簡單的過程,但是其實需要細心細心再細心,畢竟網頁的設計者不希望我們不費吹灰之力就拿到他寫的資料,大大小小的網站都是存在反爬機制的,為什麼要設定登入註冊,僅僅是為了讓你方便購物嗎?雖然這是其中很重要的一個內容,但是更多是為了防止你爬取網頁資訊。我們都明白,對一臺伺服器來說,訪問量暴增是很危險的事情,這會導致伺服器崩潰,從而使整個網站陷入癱瘓,試想:當你所選中的商品正在瘋狂打折中,而且距離搶購結束僅剩10分鐘,伺服器突然崩潰,我想你的內心也要崩潰了吧,之前鹿晗戀情曝光之後微博伺服器崩潰,導致我們的程式猿新郎官在婚禮中緊急修復微博伺服器,所以,一個好的爬蟲,他的目的就是為了拿到網路資料,但是不能影響網路的正常執行,當你大肆爬取網路資訊時,被對方檢測到你的ip正在頻繁訪問他,那麼對方就會選擇禁掉你的ip,從而阻止你的訪問,使得你需要通過驗證等操作才可訪問,這就是反爬機制。

廢話說了這麼多,下面進去具體的爬蟲操作。

1、url初窺

每個url,幾乎都是通過一系列的拼接形成的,所以需要你對你看到的url進行簡化之後訪問,這樣可以使你的url具有一定的規律,你看著也會賞心悅目。




沒有圖片確實太單調了點,但是在截圖時發現不知道截哪裡的圖。。。只能這樣截了三張。。。

2、上有政策,下有對策

之前說過對反爬的理解,正所謂上有政策下游對策(當然這個是不好的,我們要積極遵守所出的政策!!!),為了防止瀏覽器封掉我們的ip,目前常用的幾種應對方法:

(1)偽裝瀏覽器頭等資訊:這些東西在network的headers中有,僅需把這些ctrl+c,然後ctrl+v進你的程式碼裡;

(2)設定延時:我們明白,爬蟲就是模擬人的瀏覽習慣進行網頁中資料的下載,你會一動不動的保持上一個網頁剛剛開啟就開啟下一個網頁一個小時嗎?顯然是不會的,我們會等開啟之後瀏覽幾秒鐘,幾分鐘,發現裡面沒有我們需要的資訊之後再選擇開啟下一個網頁,但是計算機不懂這些呀,所以我們就需要設定一些延時,使瀏覽器看起來是一個“活生生”的人在訪問它,從而放鬆對我們的警惕,使我們的爬蟲有一個細水長流的過程。

(3)新增ip池:這個方法雖然各種教程都說過,但是你要明白一個道理,天下沒有免費的ip,就算你偶爾找到一個可用的免費ip,但是想想地球上辣麼多億人口,你能發現這個ip,那麼發現這個ip的人大有人在,所以要想使用偽造ip,辣麼最對的方法就是去租!!!沒錯,是要你掏腰包滴。

(4)其他:當然,現在還是有很多其他的方法,據我幾個月前瞭解,資料海洋的伺服器似乎是可以自動更換ip的,但是伺服器還是需要自掏腰包進行租賃,總而言之,有錢真的可以為所欲為!!!但是我這樣的窮ds還是自食其力吧。

光說不練假把式,下面貼丟丟程式碼,寫的很難看,大佬們表介意。。。

self.search_url = "http://list.tmall.com/search_product.htm?&s={page_num}&q=%BF%E3%D7%D3&sort=s&style=g&type=pc#J_Filter"  # 地址,搜尋內容為 褲子
self.detail_url = "http://detail.tmall.com/item.htm?id=16351748398&cm_id=140105335569ed55e27b&abbucket=18&on_comment=1"  # 詳情地址,需重寫
self.comment_url = "http://rate.tmall.com/list_detail_rate.htm?itemId=16351748398&sellerId=729426279¤tPage=1&_ksTS=1515553207394_471&callback=jsonp472"

# 訪問搜尋頁面的headers
self.search_headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
                       'accept-encoding': 'gzip, deflate, br',
                       'accept-language': 'zh-CN,zh;q=0.9',
                       'cache-control': 'no-cache',
                       'pragma': 'no-cache',
                       'upgrade-insecure-requests': '1',
                       'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

# 訪問評論頁面的headers
self.comment_url_headers = {'accept': '*/*',
                            'accept-encoding': 'gzip, deflate, br',
                            'accept-language': 'zh-CN,zh;q=0.9',
                            'referer': self.comment_url,
                            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',}

上面大致是寫的一些關於url,還有訪問頭的一些構造(這裡採取最常用的模擬瀏覽器訪問頭的辦法避開反爬機制),對於url,我本人不善言辭,一兩句說不清楚,只能貼出來了。

當搜尋條件為“褲子”時,你訪問的url經過簡化之後和上述程式碼相同;中間的url為每個商品詳情的url(我記得程式碼中最後似乎沒怎麼用到);最後的url就是評論存在的url。

3、先run一下

當你訪問到你需要的這些資訊之後,就需要開始對網頁的原始碼進行分析了,對於網頁的原始碼,我的建議分析兩部分,一部分是f12之後Elements中的原始碼,這些原始碼讓你快速的找到你需要的內容,另一部分是滑鼠右鍵-->檢視網頁原始碼  之後開啟的原始碼,這部分讓你清楚的認識到你之前找到的都是沒有的,雖然有點崩潰,但是事情總有解決的辦法。

對於網頁的載入,有靜態的也有動態的,對於靜態網頁來說,它天生就是這些內容;但是對於動態網頁,它天生只是一個框架而已,當後臺的資料庫進行變動時,網頁內容會跟著資料庫一起變化,所以這部分變化的東西程式猿一般都會進行一系列的動態載入,目前常用的有ajax動態載入json和jsonp資料,這就是你為什麼在原始碼中找不到這部分內容的原因了。聰明的程式猿利用動態載入使得我們找不到我們需要的資料,但是更加聰明的我們應該想到,你最終是要將你的資料丟到頁面上去啊,這樣你的資料庫和你的web端必然產生資料的互動啊,那麼肯定會有資料包產生啊,這就需要用到“抓包”的知識了。

瀏覽器的開發者工具(f12)自帶抓包工具,network中存在的東西就是資料包(筆者感覺這種說法似乎有些不妥,手懶不想查了。。。),當然你也可以用fiddle等工具進行抓包。資料包中的response內容就是我們需要查詢的“真相”(我們需要的資料不出意外應該是在這裡的)!!!

經過筆者仔細的查詢,終於找到我們所需要的資料包的所在了,接下來就開始“手腳並用”的爬蟲了!!!

4、阿哦,我們的資料這樣來

我們已經找到這些資料包,需要訪問這些資料包仍然需要訪問頭,帶著訪問頭去訪問網頁我自認為是一個好習慣,雖然有時候這樣做顯得很臃腫,但是這樣可以減少很多問題。在你成功訪問到內容後,利用beautifulsoup、正則表示式等就可以拿到你所需要的內容了。

5、讓你的資料有個家

拿到資料之後可以選擇儲存到文字(.txt)檔案中,也可以選擇儲存到資料庫內,筆者不對這兩種方法進行評價,按照你的需求來,如果儲存到txt中方便你的讀取就存到txt中,資料庫也是一樣的道理,你甚至可以存到Excel中去。

四、所遇到的問題

1、在爬取淘寶搜尋頁面中的資料時,requests.get返回200,但是print時沒有資料顯示。

        不算解決方案的解決方案:關於這點,我查閱了大量前輩們所寫的東西,發現雖然有提問,但是並沒有給出具體的解決方案,由於本人小白一枚,技術有限,雖然百思不得其解,但是毫無辦法,所以直接改爬天貓,二者本是一家,資料量還是比較可觀。

2、對評論url的分析拼接

http://rate.tmall.com/list_detail_rate.htm?itemId=16351748398&sellerId=729426279¤tPage=1&_ksTS=1515553207394_471&callback=jsonp472

這是上面說過的評論url地址,在這裡做一下說明:

itemId:商品id

sellerId:賣家id

page:頁碼

_ksTS:"_"前是當前時間戳(關於時間戳讀者請自行百度),"_"後是jsonp後的數字

callback:作為回撥函式的一部分,這部分不加其實無傷大雅,但是對取資料會有一定的影響(就是你不能取json資料,取起來比較麻煩,資料不會很整齊),這部分經過我的測試發現,“callback=jsonp”這部分是固定不變的,後面的數字利用random函式生成一個隨機數拼接上去就可以了,當然這個隨機數儘可能給個大的範圍(我就給了100到1800之間隨機生成)。

你的url就這樣拼接而成了。

五、原始碼

下面附上原始碼,雖然寫的很難看,但是希望對各位有所幫助(筆者是將資料存到txt中):

# -*- encoding:utf-8 -*-
import requests
import json
import time
import random
import re
import datetime
import save_commdity_json
from bs4 import BeautifulSoup


class Tianmao:
    def __init__(self):
        self.scj = save_commdity_json.Json_commdity()
        self.search_url = "http://list.tmall.com/search_product.htm?&s={page_num}&q=%BF%E3%D7%D3&sort=s&style=g&type=pc#J_Filter"  # 地址,搜尋內容為 褲子
        self.detail_url = "http://detail.tmall.com/item.htm?id=16351748398&cm_id=140105335569ed55e27b&abbucket=18&on_comment=1"  # 詳情地址,需重寫
        self.comment_url = "http://rate.tmall.com/list_detail_rate.htm?itemId=16351748398&sellerId=729426279¤tPage=1&_ksTS=1515553207394_471&callback=jsonp472"

        # 訪問搜尋頁面的headers
        self.search_headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
                               'accept-encoding': 'gzip, deflate, br',
                               'accept-language': 'zh-CN,zh;q=0.9',
                               'cache-control': 'no-cache',
                               'pragma': 'no-cache',
                               'upgrade-insecure-requests': '1',
                               'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        # 訪問店鋪詳情的headers
        self.request_url_headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
                                    'accept-encoding': 'gzip, deflate, br',
                                    'accept-language': 'zh-CN,zh;q=0.9',
                                    'cache-control': 'max-age=0',
                                    'upgrade-insecure-requests': '1',
                                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
        self.comment_url_headers = {'accept': '*/*',
                                    'accept-encoding': 'gzip, deflate, br',
                                    'accept-language': 'zh-CN,zh;q=0.9',
                                    'referer': self.comment_url,
                                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',}

    def open_url(self):  # 下載所有的商品url,存到資料庫中
        main_page_num = 0
        for page_num in xrange(2, 50):  # 50頁之內
            list_commdity = []
            list_price = []
            list_sale = []
            list_name = []
            list_commdity_id = []
            dic_commdity = {}
            real_search_url = self.search_url.format(page_num=page_num)
            try:
                response = requests.get(real_search_url, headers=self.search_headers)
                main_page_num = main_page_num + 1
                print str(datetime.datetime.now()) + "  sleep one minutes" + "  This is Page " + str(main_page_num)
                time.sleep(60)
                result_ = response.content
                result = result_.decode("gbk")
                # result = result_.decode(chardet.detect(result_).get('encoding'))  # 獲取頁面編碼格式並按照編碼格式解碼
                # print result
            except Exception, e:
                print e
            else:
                soup = BeautifulSoup(result, "lxml")
                all_link_commdity = soup.find_all("p", attrs={"class": "productTitle"})
                all_link_price = re.findall('<em title=".+">', result)  # 正則表示式匹配價格資訊
                all_link_sale = re.findall(u'<span>月成交 <em>.+', result)  # 正則表示式匹配月成交量資訊
                for link_sale in all_link_sale:
                    link_sale = link_sale.split(">")[2].split("<")[0]
                    list_sale.append(link_sale)
                    # print link_sale
                for link_price in all_link_price:
                    link_price = link_price.split('"')[1]
                    list_price.append(link_price)
                    # print link_price
                for link_commdity in all_link_commdity:
                    link_commdity = str(link_commdity.find_all("a", attrs={"target": "_blank"})).split('"')
                    list_commdity.append(link_commdity[3])
                    commdity_id = link_commdity[3].split("=")[1].split("&")[0]  # 商品id
                    list_commdity_id.append(commdity_id)
                    commdity_name = link_commdity[7].decode("unicode-escape")  # 商品名稱
                    list_name.append(commdity_name)
                    # print commdity_name
                    # 將資料存到資料庫中
                    # self.conn_sql.insert_tianmao_list(id=commdity_id, commdityUrl=link_commdity[3], commdityName=commdity_name)
                # self.conn_sql.close_sql()
                dic_commdity[0] = list_name
                dic_commdity[1] = list_commdity_id
                dic_commdity[2] = list_commdity
                dic_commdity[3] = list_price
                dic_commdity[4] = list_sale
                Tianmao.save_commdity(self, dic_commdity=dic_commdity)  # 商品資訊存入txt
                Tianmao.open_comment_url(self, list_commdity=list_commdity)  # 評論資訊存入txt
                # return self.dic_commdity

    def save_commdity(self, dic_commdity):
        dic_comm = dic_commdity
        list_name = dic_comm[0]  # 名稱
        list_commdity_id = dic_comm[1]  # id
        list_commdity = dic_comm[2]  # 地址
        list_price = dic_comm[3]  # 價格
        list_sale = dic_comm[4]  # 月銷量
        for num in xrange(len(list_name)):
            self.scj.save_commdity(name=list_name[num],
                                   commdity_id=list_commdity_id[num],
                                   url=list_commdity[num],
                                   price=list_price[num],
                                   sale=list_sale[num])
            print "SAVE No." + str(num) + " OVER"

    def comment_url(self, item):  # 儲存資訊到txt
        link_itemId = item.split("=")[1].split("&")[0]
        link_sellerId = item.split("=")[3].split("&")[0]
        millis = int(round(time.time() * 1000))
        random_num = random.randint(100, 1800)
        random_num_ = str(random_num + 1)
        comment_url = "https://rate.tmall.com/list_detail_rate.htm?itemId=" + link_itemId + "&sellerId=" + link_sellerId + "¤tPage={page_num}&_ksTS:" + str(millis) + "_" + str(random_num) + "&callback=jsonp" + random_num_
        return comment_url

    def open_comment_url(self, list_commdity):
        page_num_start = 0
        comment_num = 0
        for item in list_commdity:
            list_comment_all = []
            comment_url_test = Tianmao.comment_url(self, item)
            link_itemId = comment_url_test.split("=")[1].split("&")[0]
            item_url_test = comment_url_test.strip("\n").format(page_num=page_num_start)
            item_url_str_test = item_url_test.split("=")[-1] + "("
            try:
                comment_response_test = requests.get(item_url_test, headers=self.comment_url_headers)
                print "Please sleep 2 seconds"
                time.sleep(2)  # 休息2s
                comment_result_test = comment_response_test.content.decode('gbk').replace(item_url_str_test, "")[:-1]
                json_comment_page_num = json.loads(comment_result_test)['rateDetail']['paginator']['lastPage']
            except Exception, e:
                print e
            else:
                for i in xrange(1, json_comment_page_num):
                    comment_url = Tianmao.comment_url(self, item)
                    item_url = comment_url.strip("\n").format(page_num=i)
                    item_url_str = item_url.split("=")[-1] + "("
                    try:
                        comment_response = requests.get(item_url, headers=self.comment_url_headers)
                        comment_result = comment_response.content.decode('gbk').replace(item_url_str, "")[:-1]
                        print str(datetime.datetime.now()) + "  sleep 2 seconds"
                        time.sleep(2)
                        json_comment_result = json.loads(comment_result)['rateDetail']['rateList']
                        time.sleep(1)
                        len_comment = len(json_comment_result)
                    except Exception, e:
                        print e
                    else:
                        for item_comment in xrange(len_comment):  # 得到一個完整評論
                            dic_comment_page = {}
                            displayUserNick = json_comment_result[item_comment]["displayUserNick"]  # 使用者名稱
                            id = json_comment_result[item_comment]["id"]  # 訂單id
                            auctionSku = json_comment_result[item_comment]["auctionSku"]  # 所購買款式
                            goldUser = json_comment_result[item_comment]["goldUser"]  # 是否超級會員
                            rateContent = json_comment_result[item_comment]["rateContent"]  # 得到使用者評論資料
                            rateDate = json_comment_result[item_comment]["rateDate"]  # 評論時間
                            dic_comment_page["username"] = displayUserNick  # 將一個完整的使用者評論資訊存入字典
                            dic_comment_page["order_id"] = id
                            dic_comment_page["style"] = auctionSku
                            dic_comment_page["super"] = goldUser
                            dic_comment_page["ratecontent"] = rateContent
                            dic_comment_page["ratedate"] = rateDate
                            list_comment_all.append(dic_comment_page)
                            # print list_comment_all
                            comment_num = comment_num + 1
                            print "Comment: This is No." + str(comment_num)
                    self.scj.save_comment(commdity_id=link_itemId, comment_all=list_comment_all)


def main():
    down_tianmao = Tianmao()
    down_tianmao.open_url()


if __name__ == '__main__':
    main()

save_commdity_json  的原始碼

# -*- encoding:utf-8 -*-
import json
import os
import sys
reload(sys)
sys.setdefaultencoding("utf-8")


class Json_commdity:
    def __init__(self):
        pass

    def save_commdity(self, commdity_id, name, url, price, sale):
        try:
            # 商品名稱,商品id,商品地址,商品價格,月銷量,評論
            data = {"commdity_id": commdity_id, "name": name, "url": url, "price": price, "sale": sale, "comment": ""}
            json_ = json.dumps(data, indent=4).decode("unicode-escape")  # 將中文寫入需要格式轉換
            os.chdir("G:/tianmaoshuju")
            txt_name = commdity_id + ".txt"
            with open(txt_name, "w") as f:
                f.writelines(json_)
                f.close()
        except Exception, e:
            print e

    def save_comment(self, commdity_id, comment_all):
        try:
            # 評論者(匿名),訂單id,所購買款式,超級會員,評論內容,評論時間
            comment = {"comment": comment_all}
            json_comment = json.dumps(comment, indent=4).decode("unicode-escape")
            os.chdir("G:/tianmaopinglun")
            txt_name = commdity_id + ".txt"
            with open(txt_name, "w") as fo:
                fo.writelines(json_comment)
                fo.close()
        except Exception, e:
            print e


def main():
    json_c = Json_commdity()
    commdity_id = "commdity_id"
    name = "name"
    url = "url"
    price = "price"
    sale = "sale"
    json_c.save_commdity(commdity_id, name, url, price, sale)

if __name__ == '__main__':
    main()

講道理這部分程式碼寫的是真的難看,筆者自己貼出來感覺很汗顏啊,程式碼功底是硬傷,以後還需要勤加練習,希望小白的我這些東西可以幫到同是小白的你們,唉,不說了,這個程式碼是真的醜,要繼續練習程式碼了。。。

還有,目前經過筆者測試,發現搜尋條件為“褲子”的url似乎發生了改變。。。

當然,有問題可以問我,雖然我很可能,但是還是會盡力解答的。。。

本文原創,轉載請註明出處,謝謝。

最後的幾點說明:淘寶天貓和其他的網站一樣,很可能會讓你登入後才可以訪問他們的資料,這個是習以為常的,但是筆者目前精力有限,沒有做這部分的登入,當然,就筆者自身的水平而言目前寫這些東西還較為困難(畢竟對其中的加密演算法不太瞭解),往大佬們勿噴。寫本文是筆者在寫畢設中的一些歸納、整理。。再加上總結吧,僅僅是希望可以認真的對待本次畢設,好吧,就是為了一個字,過!!!再次希望各位大佬不喜勿噴。。。(雖然沒有人看,禮貌還是有的)謝謝大家

相關推薦

關於評論爬蟲

一、環境搭建開發環境python2.7,開發工具pycharm。關於python2.7環境搭建,使用搜索引擎搜尋“anaconda”,在anaconda官網下載python版本,有兩個版本可供選擇,分別是anaconda2(python2)和anaconda3(python3

rem 手機端rem佈局

淘寶就是使用了rem佈局,並且免費給我使用,使用步驟很簡單,安裝引入就ok,十分強大與方便安裝npm i -S amfe-flexible引入<meta name="viewport" content="width=device-width, initial-scale

手機適配

(function flexible (window, document) { var docEl = document.documentElement var dpr = window.devicePixelRatio || 1 // adjust body font size func

Android 仿京東 首頁的 title欄變色和下拉重新整理動畫效果

一 啥也不說了 先看效果吧 二 實現原理      1 關於 title欄的變色 其實就是根據手指移動的距離,去改變 title欄背景顏色的透明度。其他的變化就根據專案的需要來 比如字型變色啊 搜尋框變色啊         在這裡  我自定義了一個scrollView 繼

商品資料爬取

一、思路 最近做了一個網站用到了從網址爬取天貓和淘寶的商品資訊,首先看了下手機端的網頁發現用的react,不太瞭解沒法搞,所以就考慮從PC入口爬取資料,但是當爬取URL獲取資料時並沒有獲取價格,庫存等的資訊,仔細研究了下發現是非同步請求了另一個介面,但是介面要

,京東收貨信息中,自動識別手機號、姓名、省市區

reader 經緯度 nod val tostring pri location com matcher 最近工作需要,需要從一串字符串中識別出姓名,手機號和省市區,例如下面的一些字符串: 櫥之友,包衛貞,13600000000,浙江省寧波市,慈溪市,庵東鎮 杭州灣新區世

css初始化

size tex css img ace ont erl adding -a <style> blockquote, body, button, dd,d

介面taobao.tbk.sc.order.get客訂單查詢避坑指南

發現了訂單查詢介面的幾個東西 : 1、貌似不用什麼渠道ID,直接可以拿賬號的session去查訂單。 按之前官方的文件,是要配合渠道介面用的,現在獨立出來了。 2、Node.js版的SDK有個bug。 如圖,同一個response資料,一個是raw_body欄位的字串格式資料,一

手機端rem佈局詳解無限適配

這是淘寶的github網址,裡面有適配所需的js還有說明文件 地址:https://github.com/amfe/lib-flexible 1. 問題的引出 最近閱讀白樹的博文《移動web資源整理》時,他在博文中有一段指出,如果html5要適應各種解析度的移動裝置,應該使用rem這樣的尺寸

cnpm映象安裝和使用

為什麼要用cnpm?因為在國內cnpm比npm的安裝速度更快 安裝前置條件:已安裝node.js 開啟dos命令列視窗 執行npm install -g cnpm --registry=https://registry.npm.taobao.org安裝映象 使用c

mvp實現Xrecyclerview的上下拉和購物車功能仿

首先先匯入我們要使用的依賴 implementation 'com.android.support:design:28.0.0' implementation 'com.google.code.gson:gson:2.8.5' implementation 'cn.bingoo

無限適配手機端rem佈局詳解

從網易與淘寶的font-size思考前端設計稿與工作流 本文結合自己對網易與淘寶移動端首頁html元素上的font-size這個屬性的思考與學習,討論html5設計稿尺寸以及前端與設計之間協作流程的問題,內容較多,但對你的技術和工作一定有價值,歡迎閱讀和點評:)。

無限適配手機端rem佈局詳解轉載非原創

從網易與淘寶的font-size思考前端設計稿與工作流 本文結合自己對網易與淘寶移動端首頁html元素上的font-size這個屬性的思考與學習,討論html5設計稿尺寸以及前端與設計之間協作流程的問題,內容較多,但對你的技術和工作一定有價值,歡迎閱讀和點評:)。 這是淘

Nginx中的預設主機及location設定摘自

基於名字的虛擬主機 Nginx首先選定由哪一個虛擬主機來處理請求。讓我們從一個簡單的配置(其中全部3個虛擬主機都在埠*:80上監聽)開始: server { listen 80; server_name example.org www.example.org; ...

android自定義ProgressBar仿的載入效果

三種方式實現自定義圓形頁面載入中效果的進度條 To get a ProgressBar in the default theme that is to be used on white/light back ground, use one of the inverse st

Vue2中的省市區三級聯動仿

三級聯動,隨著越來越多的審美,出現了很多種,好多公司都仿著淘寶的三級聯動 ,好看時尚,so我們公司也一樣……為了貼程式碼方便,我把寫在data裡面省市區的json獨立了出來,下載貼進去即可用,連結如下:http://download.csdn.net/detail/zhao

Elasticsearch5基於completion suggester實現提示詞類京東

支援拼音首字母,全拼,和中文匹配提示,如下1、建立index,設定settingcurl -XPUT "http://localhost:9200/medcl/" -d ' { "index": { "analysis": { "analyzer": {

自定義御泥坊、360手機衛士產品詳情頁的佈局懸停效果

public class MyScrollView extends ScrollView{ private TextView mTopView;//頂部佈局檔案 private LinearLayout mFlowView;//懸停的佈局 public MyScrollView(Con

nginx健康檢測ngx_http_upstream_check_module

1、首先去這裡下載nginx的模組https://github.com/yaoweibin/nginx_upstream_check_module 下面是nginx打上模組補丁的安裝 $ wget ‘http://nginx.org/download/nginx-1.0.1

Android 多商品訂單評價類似

前幾日一商城類專案,有一需求,需要對一份訂單的裡面幾個商品進行分別評價(圖片,文字內容,星級);以前都是對一份訂單所有商品一起評價,那種簡單的多; 後來,承蒙老大細心指導,終於弄出來個看起來還算湊活的,還是先貼一下效果圖吧。。。 抖動的有點卡,gif圖的問題 圖片的相關操作展示.gif 具體評價實現