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爬虫爬取的数据可以做什么
爬虫的概念是,爬取网上能看到的数据,也就是只要网上存在的,通过浏览器可以看到的数据。爬虫都可以爬取。爬虫爬取的原理就是伪装成浏览器,然后进行爬取操作
哪些数据你需要你就可以爬取。比如爬取公司竞争对手的商业数据,爬取电影,音乐,图片等等的。只要你希望得到的,前提浏览器可以访问的都可以爬取