段時間亞馬遜日本站出公告稱賣家不能在詳情頁面上使用HTML代碼后,多位其他站點的亞馬遜賣家就開始了一連串的問候:為什么美國站并沒有這個news?為什么歐洲站并沒有這個news?是不是新規(guī)只針對日本站?
時間給出答案:歐洲站以及美國站賣家也即將不能使用HTML標簽了。
歐美站發(fā)出通知:將不再支持在詳情頁面上使用HTML標記
據(jù)了解,亞馬遜一直不建議賣家在詳情頁面上使用任何HTML內(nèi)容,這一點在商品詳情頁面規(guī)則中早已經(jīng)闡明,即使如此還是有不少亞馬遜賣家在商品描述頁面使用HTML。
近日,亞馬遜歐洲站和美國站相繼發(fā)出通知明確表示,將不再支持在詳情頁面上使用HTML標記。
從圖中內(nèi)容可以看出,為了向消費者提供安全性以及在非HTML設(shè)備上列出產(chǎn)品的多功能性,2021年7月17日之后,亞馬遜將停止支持在產(chǎn)品詳細信息頁面上的產(chǎn)品說明中使用HTML標簽。美國站賣家需要按照平臺的產(chǎn)品詳細信息頁面規(guī)則中的規(guī)定。
亞馬遜建議賣家在上述日期之前使用HTML標簽更新商品詳情頁面,賣家可以使用賣方中心或通常的渠道進行此類更新。
2021年7月17日之后,不支持在產(chǎn)品詳細信息頁面中包含HTML標記的所有產(chǎn)品描述將停止顯示HTML格式。例如,如果賣家在產(chǎn)品說明的一行中使用HTML標記,則該行可能會被刪除或不使用HTML格式顯示,這取決于標記的用法。
除了美國站,歐洲站賣家也即將不能使用HTML標記了。
從中可以看出,亞馬遜對歐洲站賣家的要求和美國站賣家大差不差,只是新規(guī)生效日期不同,暨從2021年6月19日開始,如果歐洲站賣家在產(chǎn)品說明的任何行中使用HTML標簽,則該行將被刪除或不使用HTML格式顯示。
賣家:怎么換行?怎么加粗字體?
小編了解到,很多亞馬遜賣家一直以來都是用HTML代碼來編輯詳情頁,現(xiàn)在亞馬遜不讓賣家使用HTML了,多位賣家異常惆悵:還有什么辦法實現(xiàn)換行和段落功能嗎?
一位手工賣家表示,這個政策對手工賣家來說很糟糕,因為直到最近,我們還在大量使用HTML,現(xiàn)在我們不得不接受重新編輯所有這些列表的重大噩耗!
另一位亞馬遜賣家同樣抱怨連連:這太可怕了!我仍在處理白色背景圖片,并在更新照片時重新修改了我的描述,現(xiàn)在即使是我遵循的規(guī)則,我也必須重新更改所有內(nèi)容,因為它們再次更改了規(guī)則!
實際上,這個政策也再次把品牌話題帶動了起來,用某位亞馬遜賣家自己的話說就是,亞馬遜是在逼著賣家注冊品牌,換A+,這是大勢所趨。以美國站賣家為例,亞馬遜Listing描述從7.17后不再支持HTML tags, 也就是說還不備案品牌的賣家,以后描述的頁面可能就是一堆堆的樣子,這實在是沒眼看。
小編發(fā)現(xiàn),從今年4月份開始,就陸續(xù)有賣家表示用不了HTML了:
賣家A:最近英國站不能用可視化編輯器了,我最近都是手打<b>,一用那個可視化編輯器就提示無效值。
賣家B:4月份上傳了幾個產(chǎn)品,美國站用可視化編輯器的代碼也顯示不了分行了……
值得注意的是,政策出來后賣家在以后能否用HTML換行的問題上糾結(jié)了起來。對此政策,一位賣家認為以后詳情頁描述里面,常用的換行<br>,換段落<p>,加粗<b>這些標簽都不準再用了,趁早批量用模板更新移除,否則可能會影響listing的完整顯示。
但是也有賣家表示,政策生效后仍可以用</br>換行,因為亞馬遜表示,在特殊情況下,賣家可以在描述中根據(jù)需要使用換行符 (</br>)。
小編想說,不管怎樣,賣家還是早做準備,弄清楚亞馬遜所說的特殊情況是什么意思,以免政策生效后亡羊補牢為時已晚。
商品詳情頁面規(guī)則
除了亞馬遜將停止支持在產(chǎn)品詳細信息頁面上的產(chǎn)品說明中使用HTML標簽這個新聞值得賣家關(guān)注,廣大亞馬遜賣家還需仔細研讀商品詳情頁面規(guī)則。
買家通過商品詳情頁面了解賣家的商品,亞馬遜也對商品詳情頁面進行了嚴格規(guī)定,亞馬遜要求賣家確保每個商品詳情頁面包含單一商品,這有助于為買家提供清晰且一致的購買體驗。一般來說,賣家需要遵守以下規(guī)定:
1、遵守任何相關(guān)的風格指南,避免使用HTML、JavaScript或其他代碼。
2、排除不適宜的內(nèi)容,如淫穢或攻擊性材料、鏈接或聯(lián)系信息、情節(jié)劇透、評論或評論請求以及廣告。
避免為已有詳情頁面的商品創(chuàng)建重復頁面。
3、準確地分類和描述商品。
4、為新商品或新版本創(chuàng)建新的詳情頁面。
5、僅創(chuàng)建與主要商品相關(guān)的有效“變體”。
在編寫商品信息時,亞馬遜方面表示商品詳情頁面的商品名稱、描述、要點或圖片中不允許出現(xiàn)以下任何內(nèi)容:
電話號碼、地址、電子郵件地址或網(wǎng)站URL;
供貨情況、商品價格或狀況詳情;
評論、引用或推薦內(nèi)容;
請求買家發(fā)布正面評價的言辭;
用于下訂單的其他網(wǎng)站鏈接或備選配送服務(wù)(如免費配送);
在圖片、照片或視頻上加印廣告、宣傳資料或水印;
時效性信息,如宣傳活動、研討會或講座的日期;
在屬性中全部使用大寫字母,這適用于商品名稱、要點和/或商品描述,據(jù)了解,亞馬遜允許賣家僅對每個單詞的開頭使用大寫字母。
此外,賣家還需注意的是,商品名稱不得超過200個字符(包括空格,此上限適用于所有分類,某些分類的字符數(shù)可能更少。
一句話總結(jié)就是,在亞馬遜上銷售的任何商品均應(yīng)遵守亞馬遜商品信息標準,如果賣家未遵守這些標準,則會導致負面買家體驗,并可能會導致賣家的銷售權(quán)限被暫時或永久取消。
selenium原本是一款自動化測試工具,因其出色的 頁面數(shù)據(jù)解析 和 用戶行為模擬能力 而常用于爬蟲程序中,致使爬蟲程序的爬取過程更簡單、快捷。
爬蟲程序與其它類型程序相比較,本質(zhì)一樣,為數(shù)據(jù)提供處理邏輯,只是爬蟲程序的數(shù)據(jù)來源于 HTML 代碼片段中。
怎樣準確查找到頁面中數(shù)據(jù)所在的標簽(或叫節(jié)點、元素、組件)就成了爬蟲程序的關(guān)鍵,只有這一步成立,后續(xù)的數(shù)據(jù)提取、清洗、匯總才有可能。
相比較于 Beaufulsoup 模塊, selenium 底層依靠的是強大的 瀏覽器引擎 ,在頁面解析能力上頗有王者的從容和決絕。
本文將使用 selenium 自動摸擬用戶的搜索行為,獲取不同商城上同類型商品的價格信息,最終生成商品在不同商城上的價格差對比表。
本文通過實現(xiàn)程序流程講解 selenium,只會講解程序中涉及到的 selenium 功能。不會深究其它 selenium API 的細節(jié)。所以你在閱讀本文時,請確定你對 selenium 有所一點點的了解。
本程序?qū)崿F(xiàn)了用戶不打開瀏覽器、只需要輸入一個商品關(guān)鍵字,便能全自動化的實現(xiàn)在不同商城中查找商品價格,并匯總出價格一些差異信息。
雖然本文不深究 selenium API 的細節(jié),但是,既然要用它,其使用流程還是要面面俱到。
pip3 install selenium
除了安裝 selenium 模塊,還需要為它下載一個 瀏覽器驅(qū)動程序 ,否則它無法工作。
什么是瀏覽器驅(qū)動程序?為什么需要它?
解釋這個問題,需要從 selenium 的工作原理說起。
Beautiful soup使用特定的解析器程序解析 HTML 頁面。 selenium 更干脆、直接借助瀏覽器的解析能力。通過調(diào)用瀏覽器的底層 API 完成頁面數(shù)據(jù)查找,也是跪服了,不僅爬取,還可以向瀏覽器模擬用戶行為發(fā)送操作指令。
有沒有感覺瀏覽器就是 selenium 手中的牽線木偶(玩弄瀏覽器于股掌之中)。 selenium 的工作就是驅(qū)動瀏覽器,向瀏覽器發(fā)送指令或接收瀏覽的反饋,此過程中,瀏覽器驅(qū)動程序(webdriver)就起到了上傳下達的作用。
典型的組件開發(fā)模式。
很顯然,因不同瀏覽器的內(nèi)核存在差異性,驅(qū)動程序必然也不相同,所以,下載驅(qū)動程序之前,請確定你使用的瀏覽器類型和版本。
本文使用谷歌瀏覽器,需要下載與谷歌瀏覽器對應(yīng)的 webdriver 驅(qū)動程序。
準備工作就緒后,開始編碼:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import csv
import time
import math
# 瀏覽器對象
chrome_browser = None
# 商品關(guān)鍵字
search_keyword = None
# 保存在京東商城搜索到的商品數(shù)據(jù),格式{商品名:價格}
jd_data = {}
# 保存在蘇寧商城搜索到的商品數(shù)據(jù),格式{商品名:價格}
sn_data = {}
'''
初始瀏覽器對象
'''
def init_data():
# 驅(qū)動程序存放路徑
webdriver_path = r"D:\chromedriver\chromedriver.exe"
service = Service(webdriver_path)
# 構(gòu)建瀏覽器對象
browser = webdriver.Chrome(service=service)
# 等待瀏覽器就緒
browser.implicitly_wait(10)
return browser
'''
初始用戶輸入的商品名稱關(guān)鍵字
'''
def input_search_key():
info = input("請輸入商品關(guān)鍵字:")
return info
'''
進入京東商城查詢商品信息
'''
def search_jd():
global jd_data
products_names = []
products_prices = []
# 京東首頁
jd_index_url = r"https://www.jd.com/"
# 打開京東首面
try:
if chrome_browser is None:
raise Exception()
else:
# 打開京東首頁
chrome_browser.get(jd_index_url)
# 模擬網(wǎng)絡(luò)延遲
chrome_browser.implicitly_wait(10)
# 找到文本輸入組件
search_input = chrome_browser.find_element(By.ID, "key")
# 在文本框中輸入商品關(guān)鍵字
search_input.send_keys(search_keyword)
chrome_browser.implicitly_wait(5)
# 找到搜索按鈕 這里使用 CSS 選擇器方案
search_button = chrome_browser.find_element(By.CSS_SELECTOR, "#search > div > div.form > button")
# 觸發(fā)按鈕事件
search_button.click()
chrome_browser.implicitly_wait(5)
# 獲取所有打開的窗口(當點擊按鈕后應(yīng)該有 2 個)
windows = chrome_browser.window_handles
# 切換新打開的窗口,使用負索引找到最后打開的窗口
chrome_browser.switch_to.window(windows[-1])
chrome_browser.implicitly_wait(5)
# 獲取商品價格
product_price_divs = chrome_browser.find_elements(By.CLASS_NAME, "p-price")
for i in range(5):
div = product_price_divs[i]
if len(div.text) != 0:
# 刪除價格前面的美元符號
products_prices.append(float(div.text[1:]))
# 獲取商品名稱
product_name_divs = chrome_browser.find_elements(By.CLASS_NAME, "p-name")
chrome_browser.implicitly_wait(10)
for i in range(5):
div = product_name_divs[i]
if len(div.text) != 0:
products_names.append(div.text)
jd_data = dict(zip(products_names, products_prices))
jd_data["平均價格"] = sum(products_prices) / len(products_prices)
jd_data["最低價格"] = min(products_prices)
jd_data["最高價格"] = max(products_prices)
# 使用 CSV 模塊寫入文檔
csv_save("京東商城", jd_data)
except Exception as e:
print(e)
chrome_browser:由 webdriver 構(gòu)建出來的對 瀏覽器 映射的對象, selenium 通過此對象控制對瀏覽器的所有操作。
此對象有一個 find_element( ) 核心方法,用來查找(定位)HTML 頁面元素。查找時,可以通過 By 對象指定查找的方式(這里使用了工廠設(shè)計模式), By 的取值可以是 ID、CSS_SELECTOR、XPATH、CLASS_NAME、CSS_SELECTOR、TAG_NAME、LINK_TEX、PARTIAL_LINK_TEXT。
打開京東首頁后,先定位定位 文本搜索框 和 搜索按鈕 。
使用瀏覽器的開發(fā)者工具,檢查到文本框的源代碼是一段 input html 片段,為了精確地定位到此組件,一般先試著分析此組件有沒有獨有的屬性或特征值,id 是一個不錯的選擇。html 語法規(guī)范 id 值應(yīng)該是一個唯一值。
search_input = chrome_browser.find_element(By.ID, "key")
找到組件后,可以對此組件進行一系列操作,常用的操作:
這里使用 send_keys 給文本組件賦予用戶輸入商品關(guān)鍵字。
search_input.send_keys(search_keyword)
再查找搜索按鈕組件:
按鈕組件是一段 button html 代碼,沒有過于顯著的特性屬性值,為了找到這個唯一組件,可以使用 XPATH 或 CSS 選擇器 方式。右擊此代碼片段,在彈出的快捷菜單中找到“復制”命令,再找到此組件的 CSS選擇器值。
search_button = chrome_browser.find_element(By.CSS_SELECTOR, "#search > div > div.form > button")
調(diào)用按鈕組件的 click() 方法,模擬用戶點擊操作,此操作會打開新窗口,并以列表方式顯示搜索出來的商品數(shù)據(jù)。
search_button.click()
selenium接收到瀏覽器打開新窗后的反饋后,可以使用 window_handles 屬性獲取瀏覽器中已經(jīng)打開的所有窗口,并以列表的方式存儲每一個窗口的操作引用。
windows = chrome_browser.window_handles
對頁面元素進行定位查找時,有一個當前窗口(當前可以、正在操作的窗口)的概念。剛開始是在首頁窗口操作,現(xiàn)在要在搜索結(jié)果窗口中進行操作,所以要切換到剛打開的新窗口。使用負索引得到剛打開的窗口(剛打開的窗口一定是最后一個窗口)。
chrome_browser.switch_to.window(windows[-1])
注意,這時切換到了搜索結(jié)果窗口,便可以在這個窗口中搜索所需要組件。
在這個頁面中,只需要獲取前 5 名的商品具體信息,包括商品名、商品價格。至于具體要獲取什么數(shù)據(jù),可以根據(jù)自己的需要定奪。本程序只需要商品的價格和名稱,則檢查頁面,找到對應(yīng)的 html 片段。
商品名信息存放在一個 div 片段中,此 div 有一個值為 p-name 的 class 屬性。可以使用 CSS-NAME 方式獲取,因為所有的商品采用相同片段模板,這里使用 find_elements( ) 方法即可。
product_name_divs = chrome_browser.find_elements(By.CLASS_NAME, "p-name")
find_elements方法返回具有相同 CSS-NAME 的組件列表,編寫代碼迭代出每一個組件,并獲取數(shù)據(jù),然后存儲在商品名稱列表中。
for i in range(5):
div = product_name_divs[i]
if len(div.text) != 0:
products_names.append(div.text)
以同樣的方式,獲取到價格數(shù)據(jù)。再把商品名稱和價格數(shù)據(jù)制成字典,并對價格數(shù)據(jù)做簡單分析。
jd_data = dict(zip(products_names, products_prices))
jd_data["平均價格"] = sum(products_prices) / len(products_prices)
jd_data["最低價格"] = min(products_prices)
jd_data["最高價格"] = max(products_prices)
csv_save("京東商城", jd_data)
def csv_save(sc_name, dic):
with open("d:/" + sc_name + ".csv", "w", newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow([sc_name, search_keyword + "價格分析表"])
for key, val in dic.items():
csv_writer.writerow([key, val])
以 CSV 格式存儲從京東商城上爬取下來的數(shù)據(jù)。
def search_sn():
global sn_data
# 保存商品名稱
products_names = []
# 保存商品價格
products_prices = []
# 蘇寧首頁
sn_index_url = r"https://www.suning.com/"
try:
if chrome_browser is None:
raise Exception()
else:
# 打開首頁
chrome_browser.get(sn_index_url)
# 摸擬網(wǎng)絡(luò)延遲
chrome_browser.implicitly_wait(10)
# 查找文本輸入組件
search_input = chrome_browser.find_element(By.ID, "searchKeywords")
# 在文本框中輸入商品關(guān)鍵字
search_input.send_keys(search_keyword)
time.sleep(2)
# 找到搜索按鈕 這里使用 CSS 選擇器方案
search_button = chrome_browser.find_element(By.ID, "searchSubmit")
# 觸發(fā)按鈕事件
search_button.click()
time.sleep(3)
# 獲取所有打開的窗口(當點擊按鈕后應(yīng)該有 2 個)
windows = chrome_browser.window_handles
# 切換新打開的窗口,使用負索引找到最后打開的窗口
chrome_browser.switch_to.window(windows[-1])
chrome_browser.implicitly_wait(20)
# 獲取商品價格所在標簽
product_price_divs = chrome_browser.find_elements(By.CLASS_NAME, "def-price")
# 僅查看前 5 個商品信息
for i in range(5):
div = product_price_divs[i]
# 刪除價格前面的美元符號
if len(div.text) != 0:
products_prices.append(float(div.text[1:]))
chrome_browser.implicitly_wait(10)
# 獲取商品名稱
product_name_divs = chrome_browser.find_elements(By.CLASS_NAME, "title-selling-point")
for i in range(5):
products_names.append(product_name_divs[i].text)
#
sn_data = dict(zip(products_names, products_prices))
sn_data["平均價格"] = sum(products_prices) / len(products_prices)
sn_data["最低價格"] = min(products_prices)
sn_data["最高價格"] = max(products_prices)
# 使用 CSV 模塊寫入文檔
csv_save("蘇寧商城", sn_data)
except Exception as e:
print(e)
獲取到蘇寧易購上的商品數(shù)據(jù)后,同樣以 CSV 格式存儲。
def price_result():
if len(jd_data) != 0 and len(sn_data) != 0:
with open("d:/商品比較表.csv", "w", newline='') as f:
csv_writer = csv.writer(f)
jd_name = list(jd_data.keys())
jd_price = list(jd_data.values())
sn_price = list(sn_data.values())
csv_writer.writerow(["比較項", "京東價格", "蘇寧價格", "價格差"])
for i in range(5, len(jd_price)):
csv_writer.writerow([jd_name[i], jd_price[i], sn_price[i], math.fabs(jd_price[i] - sn_price[i])])
保存了兩個商城上商品價格的平均值、最小值、最大值以及絕對差。
if __name__ == '__main__':
search_keyword = input_search_key()
chrome_browser = init_data()
search_jd()
time.sleep(2)
search_sn()
price_result()
請輸入商品關(guān)鍵字:華為meta 40
本文主要是應(yīng)用 selenium 。通過應(yīng)用過程對 selenium 做一個講解,了解 selenium 的基本使用流程。數(shù)據(jù)分析并不是本文的重點。
如果要得到更全面的分析結(jié)果,則需要提供更多維度的數(shù)據(jù)分析邏輯。
文以小米京東旗艦店平臺作為數(shù)據(jù)來源,爬取小米京東旗艦店十款熱門手機的當前在線評論文本數(shù)據(jù)5110條數(shù)據(jù),抽取小米10的手機評論數(shù)據(jù)做情感分析,對評論數(shù)據(jù)進行文本去重、機械壓縮去詞等文本預(yù)處理后,建立多種文本挖掘模型。
本文分別爬取小米京東自營旗艦店內(nèi)的十款熱門手機產(chǎn)品,不同的手機產(chǎn)品有不同的URL,不同的手機產(chǎn)品對應(yīng)的URL如下所示。
網(wǎng)絡(luò)爬蟲也稱之為網(wǎng)絡(luò)蜘蛛,是一個程序化腳本,在下載網(wǎng)頁信息時,可以實現(xiàn)循環(huán)自主化。網(wǎng)絡(luò)爬蟲通過網(wǎng)頁請求,循環(huán)自主的下載每一個網(wǎng)頁信息,并解析其頁面內(nèi)容。首先了解瀏覽網(wǎng)頁的基本流程,分為瀏覽器向服務(wù)器發(fā)送請求,接著網(wǎng)頁服務(wù)器向瀏覽器返回響應(yīng)內(nèi)容,瀏覽網(wǎng)頁的基本流程如下所示。
圖1 瀏覽網(wǎng)頁基本流程圖
接著進行網(wǎng)頁解析,HTML用于展示網(wǎng)頁的構(gòu)成信息,XML用于保存數(shù)據(jù),Xpath可用于在HTML/XML文檔中定位并且提取片段,是一種常用的查詢語言,網(wǎng)頁解析的拓撲結(jié)構(gòu)如下所示。
圖2 網(wǎng)頁解析拓撲結(jié)構(gòu)圖
爬取商品的評論數(shù)據(jù)分為請求URL、獲取商品評論頁、解析商品評論頁以及設(shè)置循環(huán)翻頁等步驟,爬取商品評論的一般流程如下所示。
圖3 商品爬取評論流程圖
了解爬蟲的基本流程后,本文選取八爪魚數(shù)據(jù)采集器,設(shè)計爬取流程,需要爬取手機產(chǎn)品的品牌信息和評論信息等,并設(shè)置循環(huán)翻頁,循環(huán)爬取該款商品每一頁的評論信息數(shù)據(jù),八爪魚流程設(shè)計如下圖所示。
圖4 爬蟲流程設(shè)計圖
共爬取小米京東自營旗艦店熱銷手機產(chǎn)品5110條數(shù)據(jù),其中以小米10的手機評論數(shù)據(jù)最多,為510條,本文抽取小米10的手機評論數(shù)據(jù)做情感分析,各種型號的手機評論數(shù)據(jù)如下圖所示。
圖5 各型號手機評論數(shù)據(jù)柱形圖
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。