python 从excel中抓取数据_使用Python抓取美团数据存于Excel中

0.程序是针对美团中的美食部分数据按好评排序采集。

要抓取保存的数据为:

商家名类型  地理位置 评论人数  均价  最低价格

1.首先编写网页数据采集函数,使用request采集网页源码,具体实现如下

def getHtml(url):

headers = ('User-Agent',

'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11')

opener = urllib.request.build_opener()

opener.addheaders = [headers]

htmldata = opener.open(url).read()

htmldata=htmldata.decode('utf-8')

return htmldata

2.根据网页源码解析获取已上线城市的url

class GetCityUrl(HTMLParser):

part = ('gaevent','changecity/build')

urldic = {}

def handle_starttag(self, tag, attrs):

if tag=='a' and (self.part in attrs):

for att,value in attrs:

if att=='href':

self.urldic.__setitem__(value, value+'/category/meishi/all/rating')

def getUrl(self):

return self.urldic

3.获取分页url

class GetPages(HTMLParser):

pagelist = list()

temphref = str()

flg = 0

initurl = str()

def setInitUrl(self,url):

self.initurl = url

def handle_starttag(self, tag, attrs):

if tag=='a':

for attr,value in attrs:

if attr=='href' and ('page' in value):

self.temphref = self.initurl + value

if self.temphref not in self.pagelist:

self.pagelist.append(self.temphref)

def getList(self):

return self.pagelist

4.解析网页源码 获取有效信息

class MyHTMLParser(HTMLParser):

tempstr = str()

divsum = int()

def handle_starttag(self, tag, attrs):

if tag=='div':

for attr,value in attrs:

if attr=='class' and value.find('poi-tile-nodeal')!=-1:

self.tempstr=''

self.divsum = 0

def handle_data(self, data):

if(data.isspace()==False):

data = data.replace('·', '·')

if data=='¥':

if '¥' not in self.tempstr:

self.tempstr+='无' +'\t'

self.tempstr+=data

elif data=='¥':

if '¥' not in self.tempstr:

self.tempstr+='无' +'\t'

self.tempstr+='¥'

elif data=='人评价':

self.tempstr=self.tempstr[0:-1]+data+'\t'

elif data=='人均 ':

self.tempstr+='人均'

elif data[0]=='起':

self.tempstr=self.tempstr[0:-1]+'起'

else:

self.tempstr+=data+'\t'

def handle_endtag(self, tag):

if tag=='div':

self.divsum+=1

if self.divsum==6:

if (self.tempstr.find('¥'))!=-1:

if (re.split(r'\t', self.tempstr).__len__())==5:

teststr = str()

flg = 0

for stmp in re.split(r'\t',self.tempstr):

if flg==2:

teststr+='无位置信息'+'\t'

teststr+=stmp+'\t'

flg+=1

self.tempstr=teststr

if (re.split(r'\t', self.tempstr).__len__())==6:

arraystr.append(self.tempstr)

self.divsum=0

self.tempstr=''

5.将信息存放于Excel中

def SaveExcel(listdata):

head=['商家名','类型','地理位置','评论人数','均价','最低价格']

wbk=xlwt.Workbook()

sheet1=wbk.add_sheet("sheet1")

ii=0

for testhand in head:

sheet1.write(0,ii,testhand)

ii+=1

i=1

j=0

for stt in listdata:

j=0

lis = re.split(r'\t',stt)

for ls in lis:

sheet1.write(i,j,ls)

j=j+1

i+=1

wbk.save('test.xls')

以下是Excel中的数据:

附录完整代码:

#encoding:utf-8

'''

Created on 2016年7月22日

python version 3.5

@author: baalhuo

'''

from html.parser import HTMLParser

import re

import urllib.request

import xlwt

import time

#存放采集的商家信息

arraystr = list()

#解析网页源码 获取有效信息

class MyHTMLParser(HTMLParser):

tempstr = str()

divsum = int()

def handle_starttag(self, tag, attrs):

if tag=='div':

for attr,value in attrs:

if attr=='class' and value.find('poi-tile-nodeal')!=-1:

self.tempstr=''

self.divsum = 0

def handle_data(self, data):

if(data.isspace()==False):

data = data.replace('·', '·')

if data=='¥':

if '¥' not in self.tempstr:

self.tempstr+='无' +'\t'

self.tempstr+=data

elif data=='¥':

if '¥' not in self.tempstr:

self.tempstr+='无' +'\t'

self.tempstr+='¥'

elif data=='人评价':

self.tempstr=self.tempstr[0:-1]+data+'\t'

elif data=='人均 ':

self.tempstr+='人均'

elif data[0]=='起':

self.tempstr=self.tempstr[0:-1]+'起'

else:

self.tempstr+=data+'\t'

def handle_endtag(self, tag):

if tag=='div':

self.divsum+=1

if self.divsum==6:

if (self.tempstr.find('¥'))!=-1:

if (re.split(r'\t', self.tempstr).__len__())==5:

teststr = str()

flg = 0

for stmp in re.split(r'\t',self.tempstr):

if flg==2:

teststr+='无位置信息'+'\t'

teststr+=stmp+'\t'

flg+=1

self.tempstr=teststr

if (re.split(r'\t', self.tempstr).__len__())==6:

arraystr.append(self.tempstr)

self.divsum=0

self.tempstr=''

#获取美团已上线城市的url 目前为844个城市地区

class GetCityUrl(HTMLParser):

part = ('gaevent','changecity/build')

urldic = {}

def handle_starttag(self, tag, attrs):

if tag=='a' and (self.part in attrs):

for att,value in attrs:

if att=='href':

self.urldic.__setitem__(value, value+'/category/meishi/all/rating')

def getUrl(self):

return self.urldic

#获取分页URL

class GetPages(HTMLParser):

pagelist = list()

temphref = str()

flg = 0

initurl = str()

def setInitUrl(self,url):

self.initurl = url

def handle_starttag(self, tag, attrs):

if tag=='a':

for attr,value in attrs:

if attr=='href' and ('page' in value):

self.temphref = self.initurl + value

if self.temphref not in self.pagelist:

self.pagelist.append(self.temphref)

def getList(self):

return self.pagelist

#采集网页源码信息

def getHtml(url):

headers = ('User-Agent',

'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11')

opener = urllib.request.build_opener()

opener.addheaders = [headers]

htmldata = opener.open(url).read()

htmldata=htmldata.decode('utf-8')

return htmldata

#将信息保存到Excel中

def SaveExcel(listdata):

head=['商家名','类型','地理位置','评论人数','均价','最低价格']

wbk=xlwt.Workbook()

sheet1=wbk.add_sheet("sheet1")

ii=0

for testhand in head:

sheet1.write(0,ii,testhand)

ii+=1

i=1

j=0

for stt in listdata:

j=0

lis = re.split(r'\t',stt)

for ls in lis:

sheet1.write(i,j,ls)

j=j+1

i+=1

wbk.save('e:/test3.xls')

par = GetCityUrl()

par.feed(getHtml('http://www.meituan.com/index/changecity/initiative'))

urldic = par.getUrl()

par = MyHTMLParser()

print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))

ffwait=1

for url in urldic:

data = getHtml(urldic.get(url))

getpage = GetPages()

getpage.setInitUrl(url)

getpage.feed(data)

pageurllist = getpage.getList()

par.feed(data)

for urltemp in pageurllist:

par.feed(getHtml(urltemp))

arraystr.append('切换地区 ')

if ffwait ==4:#此处只抓取了4个城市数据

break;

ffwait+=1

SaveExcel(arraystr)

print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))

print('Done')

学之,以记之。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值