利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...
數據挖掘入門與實戰 公眾號: datadw
本文講述如何利用Python模擬淘寶的搜索過程并對搜索結果進行初步的數據可視化分析。
搜索過程的模擬:淘寶的搜索頁面有兩種形式,
一種形式是,
2019/20190426A/F0120242
一種形式是。
2019/20190426A/F0120243
初步數據可視化分析:對搜索回來的數據,通過店鋪城市生成坐標數據,并將銷量、售價在地圖上標示出來。坐標數據的獲得要通過,
2019/20190426A/F0120245
數據可視化為利用Plotly生成Buble Map
https://plot.ly/python/bubble-maps/
利用Python模擬搜索過程
首先需要先對淘寶的模式進行標識,通過幾個關鍵詞搜索之后,可以發現其地址的變化規律,如下圖所示:
淘寶搜索脫皮綠豆試試
忽略掉q=脫皮綠豆后面的部分試試,在網址欄輸入() ,發現可行。這樣就簡單了,后續就是解析生成頁、生成翻頁器、以及存儲生成數據即可。
解析生成頁
和之前的例子類似,結合requests以及BeautifulSoup來完成頁面數據下載:
def mainPaser(url): Headers = { “User-Agent”: “Mozilla/5.0 (Windows NT 6.3; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/37.0.2049.0 Safari/537.36″} Response = requests. get(url, headers=Headers) Interial = BeautifulSoup(Response.content, ‘lxml’) pageConfig = Interial. find( ”, text=re.compile( ‘g_page_config’))
returnpageConfig. string繼續對淘寶的頁面進行Inspect,發現每一框的店鋪數據儲存在g_page_config中的auctions中,并且g_page_config中的數據為json格式。
淘寶搜索頁面
g_page_config以及auctions
獲取原始數據
在Python中,可以通過專門的解析器來完成。通過其中的loads 和dumps 可以輕易的在json以及str之間做轉換。將str轉換為json格式,在通過pandas 的獲取json中的數據信息。
每一框店鋪的數據涵括非常豐富的店鋪信息以及銷售信息,在這里僅收集寶貝分類(category)、評論數(comment_count)、寶貝位置(item_loc)、店鋪名稱(nick)、寶貝名稱(raw_title)、原價格(reserve_price)、顯示價格(view_price)、銷量(view_sales)進行分析:
neededColumns= [ ‘category’, ‘comment_count’, ‘item_loc’, ‘nick’,
‘raw_title’, ‘reserve_price’, ‘view_price’, ‘view_sales’]
PageConfig= re.search(r ‘g_page_config = (.*?);n’,
pageConfig.string)
pageConfigJson= json.loads(gPageConfig.group( 1))
pageItems= pageConfigJson[ ‘mods’][ ‘itemlist’][ ‘data’][ ‘auctions’]
pageItemsJson= json.dumps(pageItems)
pageData= pd.read_json(pageItemsJson)
neededData= pageData[Paser.neededColumns]
整理生成數據
接下來就是對得出的數據進行整理,我們先看看neededData的結構是如何,如下表所示:
neededData
其中item_loc是網店的地址,可以看到直轄市是比較特殊的存在,將這一列改的省份名稱刪掉,方法是單獨將這一列拿出來通過
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.split.html
來處理,以空格為標識符,將該列的省份以及城市拆分為兩列,結果如下圖,通過
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
向左填充對None進行填充:
fillna前
fillna后
這樣就實現對item_loc列的修改,看回neededData那張圖,最后一列view_sales中,需要將每個單元格中付款兩個字刪去。需要采用,
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.extract.html
結合正則表達式來處理。將數字文本拖出來之后,還需要通過
函數將其轉化為int格式,并增加時間列。最后該段數據整理的代碼,以及處理后的效果圖為:
cityData = neededData[ ‘item_loc’] .str.split( ‘ ‘, expand = True)cityData.fillna(method = ‘pad’, axis= 1, inplace= True)neededData .loc[:,( ‘item_loc’)] = cityData[ 1]neededData .loc[:,( ‘view_sales’)] = neededData[ ‘view_sales’] .str.extract( ‘([d]*)
([w]*)’).get( 0)neededData .loc[:,( ‘view_sales’)] = neededData[ ‘view_sales’].astype(int)neededData[ ‘time’] = datetime .datetime.now().strftime( ‘%Y%m%d%H’)
處理結果
生成翻頁器
最后就是生成翻頁器了,在剛剛的g_page_config中搜索pager試試:
尋找翻頁器
尋找翻頁器
將其中的u003d和=以及u0026和&作替換(我是通過字符替換處理。。單應該存在更加方便的,從編碼角度入手處理的方法。。求指教),并更換一二三頁,發現網址最后的參數s分別為0,44,88。結合上面第二張圖,可以猜到這個數字為單頁的店鋪總量,當頁面默認每頁的店鋪數為44的時候,只需要更改該參數即可達到翻頁效果。
數據可視化
為了對將銷售數據以及評論數據放在地圖上,顯示區域集中情況,首先需要將城市信息轉化為坐標信息,這個時候需要用到。而為了減少反復查詢的次數,需要對坐標信息進行存儲,即將位置數據存儲在sql中,邏輯是這樣:
查詢框圖邏輯
采用sqlite進行地理數據的存儲和查詢,對于查詢存在的數據直接輸出,查詢不存在的數據需要通過高德地圖的功能查詢。
2019/20190426A/F0120256
首先需要注冊自己的一個key,并在對應賬號的控制版內增加Web服務API功能,使用過程中將key值以及設置信息用dict格式表示,并加載在requests的param中。查詢輸出的數據格式有兩種,一種是json,一種是xml。這里輸出json,對json的字符串通過正則表達式將經緯度信息提取出來,提取出后存儲在數據文件中,并進行輸出。
defgetCenter(city):conn = sqlite3.connect( ‘citydata.db’) cursor = conn.cursor() cursor.execute( “CREATE TABLE IF NOT EXISTS CITYDATA(citycode text primary key
, name text, latitude real, longitude real);”) cursor.execute( “SELECT latitude, longitude FROM CITYDATA WHERE name = ?”,
(city,)) res = cursor.fetchall() ifnotres: payload = { ##yourkey = the key applied from amap.com‘key’:yourkey, ‘keywords’: ”, ‘subdistrict’: ‘0’, ‘showbiz’:
False, ‘output’: ‘json’, } payload[ ‘keywords’] = city jsonData = requests.get( ‘2019/20190426A/F0120257
params = payload) jsonText = jsonData.text center = re.search( r'”([d]*.[d]*),([d]*.[d]*)”‘, jsonText) cityCode = re.search( r'”citycode”:”(d*)”‘, jsonText) latitude = float(center.group( 1)) longitude = float(center.group( 2)) cursor.execute( “INSERT INTO CITYDATA VALUES(?, ?, ?, ?);”, [cityCode.group( 1),
city, latitude, longitude]) cursor.close() conn.commit() returnlatitude, longitude else: res = list(res[ 0]) returnres[ 0], res[ 1]
經緯度數據獲得后,需要輸出到現有的dataFrame中,由于上述函數有兩個輸出,不能通過apply函數得出,需要結合zip以及map函數來實現雙輸出:
neededData[ ‘latitude’], neededData[ ‘longitude’] = zip(*neededData[ ‘item_loc’].map(getCenter))
數據可視化
dataFrame的可視化工具有很多,常用的有matplotlib。但對于生成地理信息圖,似乎plotly更具有優勢,并且經過優化后,plotly生成的圖像質量要更高。嘗試下對view_sales列進行可視化操作,首先對該列進行排序:
neededData.sort_values( ‘view_sales’, axis = 0, ascending= False, inplace= True)
plotly在第一次使用的時候也需要設置自己的賬號信息,具體可以參考,
https://plot.ly/python/getting-started/
本機只要設置過一次賬號后,后面就可以不用再設置了。
首先需要對圖例進行設置:
import plotly.plotly as py length= len(newData)limits = [( 0, int( 0.05* length)),( int( 0.05* length), int( 0.2* length)),
( int( 0.2* length), int( 0.5* length)),( int( 0.5* length), length)]colors = [ “#0A3854”, “#3779A3”, “#1B85C6”, “#C0DAEA”]cities = []
而后就是設置每個點的地理信息、泡泡面積大小、泡泡顏色,并將dataFrame中的數據轉換為ployly可識別的格式中:
for i inrange(len(limits)): lim= limits[i] df_sub= newData[lim[ 0]:lim[ 1]]
city= dict( type= ‘scattergeo’, locationmode= ‘china’,
lon= df_sub[‘longitude’], lat= df_sub[‘latitude’],
text= df_sub[‘nick’], marker= dict(
size= df_sub[‘view_sales’]/ 10, color= colors[i],
line= dict( width= 0.5, color= ‘ #000′),sizemode= ‘area’, opacity= 0.5),
name= “{0} – {1}”.format(lim[ 0], lim[ 1]) ) cities.append(city)
最后是對圖紙信息進行設定,包括標題,是否顯示圖例。由于ployly中已經包含有地圖信息,因此只需設定顯示區域(scope),投影方式(projection),以及邊界線條顏色和邊界信息即可:
layout = dict( title= Keyword + “的淘寶分布”, showlegend = True, geo = dict( scope= “asia”, projection = dict( type= ‘mercator’), showland = True, landcolor = ‘rgb( 217, 217, 217)’, subunitwidth=1, countrywidth=1, subunitcolor= “rgb(255, 255, 255)”, countrycolor= “rgb(255, 255, 255)”, lonaxis = dict( range= [newData[‘longitude’].min() -3, newData[‘longitude’].max() + 3]), lataxis = dict( range= [newData[‘latitude’].min() -0.5, newData[‘latitude’].max() + 0.5]), ),)
完成后,輸出保存即可:
fig= dict( data= cities, layout= layout)py.iplot(fig, validate= False)
脫皮綠豆的淘寶分布
總結
本文基本實現了最初目的,模擬了淘寶的搜索數據,并初步對數據進行可視化。但該程序還有很多優化的地方:
在搜索過程中,發現對于同一個關鍵詞會出現很多不同種類的東西,例如你搜索蘋果,可能會出現iphone也有可能出現能吃的蘋果,不方便;
結合ML,實現深度的搜索,對同一個物品進行價格對比,銷量對比,客戶評價對比,幫助客戶進行選擇;
可視化的意義沒有體現出來;
本文中,還有bug未完善,很多地方需要采用try來規避。
文http://www.jianshu.com/p/9a9468d6d3ec
新浪微博名稱:大數據_機器學習
數據挖掘入門與實戰
搜索添加微信公眾號:datadw
教你機器學習,教你數據挖掘
長按圖片,識別二維碼,點關注
總結
以上是生活随笔為你收集整理的利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼装机器人感想_智能机器人心得体会
- 下一篇: Python学习笔记:Day14 完成W