日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

發(fā)布時(shí)間:2025/3/15 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。