利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...
數(shù)據(jù)挖掘入門與實(shí)戰(zhàn) 公眾號(hào): datadw
本文講述如何利用Python模擬淘寶的搜索過程并對(duì)搜索結(jié)果進(jìn)行初步的數(shù)據(jù)可視化分析。
搜索過程的模擬:淘寶的搜索頁面有兩種形式,
一種形式是,
2019/20190426A/F0120242
一種形式是。
2019/20190426A/F0120243
初步數(shù)據(jù)可視化分析:對(duì)搜索回來的數(shù)據(jù),通過店鋪城市生成坐標(biāo)數(shù)據(jù),并將銷量、售價(jià)在地圖上標(biāo)示出來。坐標(biāo)數(shù)據(jù)的獲得要通過,
2019/20190426A/F0120245
數(shù)據(jù)可視化為利用Plotly生成Buble Map
https://plot.ly/python/bubble-maps/
利用Python模擬搜索過程
首先需要先對(duì)淘寶的模式進(jìn)行標(biāo)識(shí),通過幾個(gè)關(guān)鍵詞搜索之后,可以發(fā)現(xiàn)其地址的變化規(guī)律,如下圖所示:
淘寶搜索脫皮綠豆試試
忽略掉q=脫皮綠豆后面的部分試試,在網(wǎng)址欄輸入() ,發(fā)現(xiàn)可行。這樣就簡(jiǎn)單了,后續(xù)就是解析生成頁、生成翻頁器、以及存儲(chǔ)生成數(shù)據(jù)即可。
解析生成頁
和之前的例子類似,結(jié)合requests以及BeautifulSoup來完成頁面數(shù)據(jù)下載:
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繼續(xù)對(duì)淘寶的頁面進(jìn)行Inspect,發(fā)現(xiàn)每一框的店鋪數(shù)據(jù)儲(chǔ)存在g_page_config中的auctions中,并且g_page_config中的數(shù)據(jù)為json格式。
淘寶搜索頁面
g_page_config以及auctions
獲取原始數(shù)據(jù)
在Python中,可以通過專門的解析器來完成。通過其中的loads 和dumps 可以輕易的在json以及str之間做轉(zhuǎn)換。將str轉(zhuǎn)換為json格式,在通過pandas 的獲取json中的數(shù)據(jù)信息。
每一框店鋪的數(shù)據(jù)涵括非常豐富的店鋪信息以及銷售信息,在這里僅收集寶貝分類(category)、評(píng)論數(shù)(comment_count)、寶貝位置(item_loc)、店鋪名稱(nick)、寶貝名稱(raw_title)、原價(jià)格(reserve_price)、顯示價(jià)格(view_price)、銷量(view_sales)進(jìn)行分析:
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’][ ‘a(chǎn)uctions’]
pageItemsJson= json.dumps(pageItems)
pageData= pd.read_json(pageItemsJson)
neededData= pageData[Paser.neededColumns]
整理生成數(shù)據(jù)
接下來就是對(duì)得出的數(shù)據(jù)進(jìn)行整理,我們先看看neededData的結(jié)構(gòu)是如何,如下表所示:
neededData
其中item_loc是網(wǎng)店的地址,可以看到直轄市是比較特殊的存在,將這一列改的省份名稱刪掉,方法是單獨(dú)將這一列拿出來通過
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.split.html
來處理,以空格為標(biāo)識(shí)符,將該列的省份以及城市拆分為兩列,結(jié)果如下圖,通過
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html
向左填充對(duì)None進(jìn)行填充:
fillna前
fillna后
這樣就實(shí)現(xiàn)對(duì)item_loc列的修改,看回neededData那張圖,最后一列view_sales中,需要將每個(gè)單元格中付款兩個(gè)字刪去。需要采用,
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.extract.html
結(jié)合正則表達(dá)式來處理。將數(shù)字文本拖出來之后,還需要通過
函數(shù)將其轉(zhuǎn)化為int格式,并增加時(shí)間列。最后該段數(shù)據(jù)整理的代碼,以及處理后的效果圖為:
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’)
處理結(jié)果
生成翻頁器
最后就是生成翻頁器了,在剛剛的g_page_config中搜索pager試試:
尋找翻頁器
尋找翻頁器
將其中的u003d和=以及u0026和&作替換(我是通過字符替換處理。。單應(yīng)該存在更加方便的,從編碼角度入手處理的方法。。求指教),并更換一二三頁,發(fā)現(xiàn)網(wǎng)址最后的參數(shù)s分別為0,44,88。結(jié)合上面第二張圖,可以猜到這個(gè)數(shù)字為單頁的店鋪總量,當(dāng)頁面默認(rèn)每頁的店鋪數(shù)為44的時(shí)候,只需要更改該參數(shù)即可達(dá)到翻頁效果。
數(shù)據(jù)可視化
為了對(duì)將銷售數(shù)據(jù)以及評(píng)論數(shù)據(jù)放在地圖上,顯示區(qū)域集中情況,首先需要將城市信息轉(zhuǎn)化為坐標(biāo)信息,這個(gè)時(shí)候需要用到。而為了減少反復(fù)查詢的次數(shù),需要對(duì)坐標(biāo)信息進(jìn)行存儲(chǔ),即將位置數(shù)據(jù)存儲(chǔ)在sql中,邏輯是這樣:
查詢框圖邏輯
采用sqlite進(jìn)行地理數(shù)據(jù)的存儲(chǔ)和查詢,對(duì)于查詢存在的數(shù)據(jù)直接輸出,查詢不存在的數(shù)據(jù)需要通過高德地圖的功能查詢。
2019/20190426A/F0120256
首先需要注冊(cè)自己的一個(gè)key,并在對(duì)應(yīng)賬號(hào)的控制版內(nèi)增加Web服務(wù)API功能,使用過程中將key值以及設(shè)置信息用dict格式表示,并加載在requests的param中。查詢輸出的數(shù)據(jù)格式有兩種,一種是json,一種是xml。這里輸出json,對(duì)json的字符串通過正則表達(dá)式將經(jīng)緯度信息提取出來,提取出后存儲(chǔ)在數(shù)據(jù)文件中,并進(jìn)行輸出。
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]
經(jīng)緯度數(shù)據(jù)獲得后,需要輸出到現(xiàn)有的dataFrame中,由于上述函數(shù)有兩個(gè)輸出,不能通過apply函數(shù)得出,需要結(jié)合zip以及map函數(shù)來實(shí)現(xiàn)雙輸出:
neededData[ ‘latitude’], neededData[ ‘longitude’] = zip(*neededData[ ‘item_loc’].map(getCenter))
數(shù)據(jù)可視化
dataFrame的可視化工具有很多,常用的有matplotlib。但對(duì)于生成地理信息圖,似乎plotly更具有優(yōu)勢(shì),并且經(jīng)過優(yōu)化后,plotly生成的圖像質(zhì)量要更高。嘗試下對(duì)view_sales列進(jìn)行可視化操作,首先對(duì)該列進(jìn)行排序:
neededData.sort_values( ‘view_sales’, axis = 0, ascending= False, inplace= True)
plotly在第一次使用的時(shí)候也需要設(shè)置自己的賬號(hào)信息,具體可以參考,
https://plot.ly/python/getting-started/
本機(jī)只要設(shè)置過一次賬號(hào)后,后面就可以不用再設(shè)置了。
首先需要對(duì)圖例進(jìn)行設(shè)置:
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 = []
而后就是設(shè)置每個(gè)點(diǎn)的地理信息、泡泡面積大小、泡泡顏色,并將dataFrame中的數(shù)據(jù)轉(zhuǎn)換為ployly可識(shí)別的格式中:
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= ‘a(chǎn)rea’, opacity= 0.5),
name= “{0} – {1}”.format(lim[ 0], lim[ 1]) ) cities.append(city)
最后是對(duì)圖紙信息進(jìn)行設(shè)定,包括標(biāo)題,是否顯示圖例。由于ployly中已經(jīng)包含有地圖信息,因此只需設(shè)定顯示區(qū)域(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)
脫皮綠豆的淘寶分布
總結(jié)
本文基本實(shí)現(xiàn)了最初目的,模擬了淘寶的搜索數(shù)據(jù),并初步對(duì)數(shù)據(jù)進(jìn)行可視化。但該程序還有很多優(yōu)化的地方:
在搜索過程中,發(fā)現(xiàn)對(duì)于同一個(gè)關(guān)鍵詞會(huì)出現(xiàn)很多不同種類的東西,例如你搜索蘋果,可能會(huì)出現(xiàn)iphone也有可能出現(xiàn)能吃的蘋果,不方便;
結(jié)合ML,實(shí)現(xiàn)深度的搜索,對(duì)同一個(gè)物品進(jìn)行價(jià)格對(duì)比,銷量對(duì)比,客戶評(píng)價(jià)對(duì)比,幫助客戶進(jìn)行選擇;
可視化的意義沒有體現(xiàn)出來;
本文中,還有bug未完善,很多地方需要采用try來規(guī)避。
文http://www.jianshu.com/p/9a9468d6d3ec
新浪微博名稱:大數(shù)據(jù)_機(jī)器學(xué)習(xí)
數(shù)據(jù)挖掘入門與實(shí)戰(zhàn)
搜索添加微信公眾號(hào):datadw
教你機(jī)器學(xué)習(xí),教你數(shù)據(jù)挖掘
長(zhǎng)按圖片,識(shí)別二維碼,點(diǎn)關(guān)注
總結(jié)
以上是生活随笔為你收集整理的利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼装机器人感想_智能机器人心得体会
- 下一篇: Python学习笔记:Day14 完成W