利用pyecharts绘制微博粉丝地区分布图

任务

爬虫爬取的数据包括个人的地区,故可视化能够将其在地图上显示出来。

过程

获取数据

依然沿用之前的框架,构造访问某博主粉丝页面的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测试项目

发布了39 篇原创文章 · 获赞 3 · 访问量 4658

猜你喜欢

转载自blog.csdn.net/cascara/article/details/104172602