爬虫爬取的数据包括个人的地区,故可视化能够将其在地图上显示出来。
依然沿用之前的框架,构造访问某博主粉丝页面的URL:
###某微博账户的粉丝
def contentURL(id,pages):
i=0
urls=[]
for page in pages:
if page not in [0,1]:
urls+=['https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_'+str(id)+'&page='+str(page)]
return urls
将需要的数据写入csv文件中:
###在已有的一系列urls中进行操作
###筛选出微博转发内容进行操作
def reRatio(urls,csvWriter):
notEnd= True
fansUserTitle=getInfoTitle(userRangeDict,'')#粉丝信息标题
infoTitle=getInfoTitle(infoRangeDict,'')#原文博主个人主页信息标题
#写表格的标题
if getConcreteInfoList is True:
csvWriter.writerow(fansUserTitle+infoTitle)
else:
csvWriter.writerow(fansUserTitle)
for url in urls:
response = requests.get(url,headers=headers)
resjson = json.loads(response.text)
if resjson['ok'] ==0:
notEnd=False
break
cards=resjson['data']['cards']
if(len(cards)==1):
try:
cards=cards[0]['card_group']
except:
notEnd=False
break
#遍历一个页面的所有微博
for card in cards:
try:
#fans个人信息
fansUserInfoDict=card['user']
infoList=[]
#原文博主数据
fansUserInfoList=getInfoList(fansUserInfoDict,userRangeDict)
infoList+=fansUserInfoList
fansUserID=fansUserInfoDict['id']
#fansUserID为粉丝账号的ID
#可在此对id进行信息采集
if getConcreteInfoList is True:
infoDict=getInfo(isLogin,fansUserID)
otherInfoList=getInfoList(infoDict,infoRangeDict)
infoList+=otherInfoList
#print(infoList)
#保存数据至csv
csvWriter.writerow(infoList)
#不断获取该博主粉丝
#break
except:
pass
#延时,防止反爬
time.sleep(3)
return notEnd
其余保持不变即可获取到包含所需数据的文件。
沿用之前的工具读入数据。
直接调用字典类即可得到需要的数据:
sites=dataDict['所在地']
首先对获取到的所有地区做统计。
countSite={}
for site in sites:
if site.find(' ')> 0:
#print(item)
province=site.split(' ')[0]
city=site.split(' ')[-1]
site=province
#print(site)
if countSite.get(site) is None:
countSite[site]=1
else:
countSite[site]+=1
观察pyecharts绘制地图的范例传入的数据格式,为列表类型。如下所示:
['地区',数值]
故将统计结果转化为此格式,并筛去无效地点:
validSites=[]
for site in countSite:
if site not in ['其他','未知','海外']:
validSites.append([site,countSite[site]])
#print(validSites)
min_data=min([d[1] for d in validSites])
max_data=max([d[1] for d in validSites])
将数据传入绘图代码:
from pyecharts import options as opts
from pyecharts.charts import Geo, Page, Bar ,Graph
from pyecharts.faker import Collector, Faker
from pyecharts.globals import CurrentConfig,NotebookType,ChartType, SymbolType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts.render import make_snapshot
from snapshot_phantomjs import snapshot
if choice=='热力':
title=tweeter+'粉丝地区分布热力图'
type=ChartType.HEATMAP
else:
title=tweeter+'粉丝地区分布散点图'
type=ChartType.EFFECT_SCATTER
def geo_heatmap() -> Geo:
c = (
Geo()
.add_schema(
maptype="china",
itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"),
)
.add(
"",
validSites,
#[list(z) for z in zip(Faker.provinces, Faker.values())],
type_=type,
label_opts=opts.LabelOpts(is_show=False),
#type_=,
#color="white",
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
visualmap_opts=opts.VisualMapOpts(
min_=min_data,
max_=max_data,
),
title_opts=opts.TitleOpts(title=title),
)
)
return c
即可绘制图像。
将图片保存至本地:
address=addrFile(tweeter,title+'.png')
make_snapshot(snapshot, geo_heatmap().render(), address)
参考pyecharts官方文档关于此的配置说明——渲染图片
GitHub测试项目