python爬取數據
『壹』 python爬取的數據如何去重說一下具體的演算法依據
要具體問題具體分析的。看你要抓取什麼數據。
最好能找到一個能夠作為重復性區分的欄位值。比如網路知道的所有提問,每個問題都有一個對應的id,樓主這個問題對應的id就是181730605611341844。那在爬取的過程中,可以將所有已經爬取的問題id保存在一個set()中,如果即將爬取的問題id已經存在了,那就跳過,反之則繼續。
不知道樓主用的是什麼資料庫,在資料庫設計中,也可以添加一些約束條件作為約束,保證數據的唯一性。
『貳』 如何用python爬取nba數據中心的數據
爬取的網站為:stat-nba.com,本文爬取的是NBA2016-2017賽季常規賽至2017年1月7日的數據
改變url_header和url_tail即可爬取特定的其他數據。
源代碼如下:
[python]view plain
#coding=utf-8
importsys
reload(sys)
sys.setdefaultencoding('utf-8')
importrequests
importtime
importurllib
frombs4importBeautifulSoup
importre
frompyExceleratorimport*
defgetURLLists(url_header,url_tail,pages):
"""
獲取所有頁面的URL列表
"""
url_lists=[]
url_0=url_header+'0'+url_tail
printurl_0
url_lists.append(url_0)
foriinrange(1,pages+1):
url_temp=url_header+str(i)+url_tail
url_lists.append(url_temp)
returnurl_lists
defgetNBAAllData(url_lists):
"""
獲取所有2017賽季NBA常規賽數據
"""
datasets=['']
foriteminurl_lists:
data1=getNBASingleData(item)
datasets.extend(data1)
#去掉數據里的空元素
foritemindatasets[:]:
iflen(item)==0:
datasets.remove(item)
returndatasets
defgetNBASingleData(url):
"""
獲取1個頁面NBA常規賽數據
"""
QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017'
#html=requests.get(url).text
html=urllib.urlopen(url).read()
#printhtml
soup=BeautifulSoup(html)
data=soup.html.body.find('tbody').text
list_data=data.split(' ')
#withopen('nba_data.txt','a')asfp:
#fp.write(data)
#foriteminlist_data[:]:
#iflen(item)==0:
#list_data.remove(item)
returnlist_data
defsaveDataToExcel(datasets,sheetname,filename):
book=Workbook()
sheet=book.add_sheet(sheetname)
sheet.write(0,0,u'序號')
sheet.write(0,1,u'球隊')
sheet.write(0,2,u'時間')
sheet.write(0,3,u'結果')
sheet.write(0,4,u'主客')
sheet.write(0,5,u'比賽')
sheet.write(0,6,u'投籃命中率')
sheet.write(0,7,u'命中數')
sheet.write(0,8,u'出手數')
sheet.write(0,9,u'三分命中率')
sheet.write(0,10,u'三分命中數')
sheet.write(0,11,u'三分出手數')
sheet.write(0,12,u'罰球命中率')
sheet.write(0,13,u'罰球命中數')
sheet.write(0,14,u'罰球出手數')
sheet.write(0,15,u'籃板')
sheet.write(0,16,u'前場籃板')
sheet.write(0,17,u'後場籃板')
sheet.write(0,18,u'助攻')
sheet.write(0,19,u'搶斷')
sheet.write(0,20,u'蓋帽')
sheet.write(0,21,u'失誤')
sheet.write(0,22,u'犯規')
sheet.write(0,23,u'得分')
num=24
row_cnt=0
data_cnt=0
data_len=len(datasets)
print'data_len:',data_len
while(data_cnt<data_len):
row_cnt+=1
print'序號:',row_cnt
forcolinrange(num):
#printcol
sheet.write(row_cnt,col,datasets[data_cnt])
data_cnt+=1
book.save(filename)
defwriteDataToTxt(datasets):
fp=open('nba_data.txt','w')
line_cnt=1
foriinrange(len(datasets)-1):
#球隊名稱對齊的操作:如果球隊名字過短或者為76人隊是球隊名字後面加兩個table否則加1個table
ifline_cnt%24==2andlen(datasets[i])<5ordatasets[i]==u'費城76人':
fp.write(datasets[i]+' ')
else:
fp.write(datasets[i]+' ')
line_cnt+=1
ifline_cnt%24==1:
fp.write(' ')
fp.close()
if__name__=="__main__":
pages=int(1132/150)
url_header='hp?page='
url_tail='&QueryType=game&order=1&crtcol=date_out&GameType=season&PageNum=3000&Season0=2016&Season1=2017#label_show_result'
url_lists=getURLLists(url_header,url_tail,pages)
datasets=getNBAAllData(url_lists)
writeDataToTxt(datasets)
sheetname='nbanormaldata2016-2017'
str_time=time.strftime('%Y-%m-%d',time.localtime(time.time()))
filename='nba_normal_data'+str_time+'.xls'
saveDataToExcel(datasets,sheetname,filename)
『叄』 Python 最簡單爬蟲爬取數據(一):如何請求
import requests
url=『http://www..com』
r = requests.get(url,timeout=10)
r.raise_for_status()
r.encoding = r.apparent_encoding
print( r.text)
『肆』 怎麼使用python爬取百度網的數據
檔案系統初期算是告一段落了,利用一點時間繼續爬取POI。和領導聊聊,受益匪淺。之前我的想法是爬取一份poi數據,直接能用;而領導聽了之後,覺得更好的方式是爬取多個渠道來源的POI數據,然後做一個數據比較融合(最終事情能不能成不好說,但是經過這么一回,細節技術上有所提高,宏觀把控整體項目流程能力有所長進,更重要的是通過和能人交流,以更高的眼界更宏觀的看待數據、應用以及問題,這就是成長)。 我之前採用的方式,可以滿足需求,但是POI數據獲取效率差一些(雖然已經很快,但是相比本文這種還是慢一些)、數據現勢性不好,高德數據和網路數據雖然是兩套,但是僅僅是坐標不同(所以顯然還是一套)。所以,我加一種方式來爬取網路poi。
一 調研: 網路API提供了一個叫Place API獲取poi的介面,有個城市內檢索 實例為
ce/v2/search?query=銀行&page_size=10&page_num=0&scope=1®ion=北京&output=json&ak={您的密鑰}
它返回的是個json類型數據,一個區域最大返回數為400,每頁最大返回數為20。顯然一個城市內不管什麼類別的poi,不可能只有400個,會遺漏數據,故捨去
還有一個矩形區域檢索,實例為
u.com/place/v2/search?query=美食&page_size=10&page_num=0&scope=1&bounds=39.915,116.404,39.975,116.414&output=json&ak={您的密鑰}只要區域劃分得當,這個可以使用
二 要解決的問題
1 區域劃分
網上有人通過遞歸寫代碼的方式來劃分,這樣劃分有問題,第一,劃分的區域不能完全對應一個城市的市區;第二,演算法設計比較麻煩。解決辦法,後面詳細說。
2 類別問題
網路API的介面必須要指定query的類別,那麼如果類別指定不準,或者類別不全,根本無法完成爬取一個城市所有poi的任務。解決辦法,說實話,這個問題在我做這件事情的時候,
十分棘手,不過我最終找到了這個網頁
/index.php?title=lbscloud/poitags,一切都不是問題了
三 整體流程
1 區域劃分,2km*2km的區域基本可以滿足需求,獲取每個區域的對角坐標(經緯度),逐行寫入一個txt文本里
2 爬蟲程序編寫 讀取1中的txt文本,逐行循環;調用網路API介面,爬取json;將爬取的數據存入資料庫中; 每個類別跑一次程序
3 爬下的POI數據處理 poi顯示,投影坐標轉換,與地圖疊加
後文將詳細介紹流程
『伍』 怎麼用python爬取相關數據
以下代碼運行通過:
importrequests
frombs4importBeautifulSoup
importos
headers={
'User-Agent':"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.1(KHTML,likeGecko)"
"Chrome/22.0.1207.1Safari/537.1"}
##瀏覽器請求頭(大部分網站沒有這個請求頭會報錯)
all_url='http://www.mzitu.com/all'
start_html=requests.get(all_url,headers=headers)
##使用requests中的get方法來獲取all_url的內容headers為請求頭
print(start_html.text)
##列印start_html
##concent是二進制的數據,下載圖片、視頻、音頻、等多媒體內容時使用concent
##列印網頁內容時使用text
運行效果:
『陸』 python 爬取的數據導出到excel
把print出來的,都存到一個list里。
all_case=['姓名','張三','年齡','18'...]
b=[]
x=0
y=0
for i in range(0,len(all_case),2):
b = all_case[i:i+2]
for i in b:
ws.write(x,y,i,style)
x+=1
y+=1
x=0
wtbook.save(path_dst)
上面是核心內容,你理解一下。就是將list變為2個元素一組的小list,然後對小list按行寫入,寫完到下一個小list再回到第一行。
寫完發現沒有格式啊。。。注意一下x+=1和裡面for是一組。y+=1和x=0和外面的for是一組。
『柒』 python爬數據
withopen('文本文檔(1)','r')asfin:
withopen('文本文檔(2)','w')asfout:
forlineinfin:
if'food'inline:
fout.write(line)
『捌』 python爬蟲數據提取
理論上可以,實際要看目標網頁的情況,反爬蟲機制、js動態刷新抓取都是比較頭疼的。
當然如果不考慮效率,selenium 之類的網頁自動化方式,通常都可以實現。
『玖』 python爬蟲爬取的數據可以做什麼
爬蟲的概念是,爬取網上能看到的數據,也就是只要網上存在的,通過瀏覽器可以看到的數據。爬蟲都可以爬取。爬蟲爬取的原理就是偽裝成瀏覽器,然後進行爬取操作
哪些數據你需要你就可以爬取。比如爬取公司競爭對手的商業數據,爬取電影,音樂,圖片等等的。只要你希望得到的,前提瀏覽器可以訪問的都可以爬取