Python+海表|使用Python从维基百科抓取冬奥城市信息并制作地图但在很多应用场景中,我们不再局限于将抓取的数据存储在表格中,还需要更直观的去可视化。例如,在本案例中,使用Python从维基百科中抓取过去举办过冬奥会的城市,然后制作地图、图库,甚至进行灵活的共享和协作。要实现这一点,如果在抓取数据后使用Python来可视化和分享网页,会更加复杂和低效,而且对于很多非专业人士来说,会限制它的使用。并且如果结合SeaTable形式会非常方便,任何人都可以上手。作为一种新型的在线协同表单和信息管理工具,它不仅可以方便地管理各类数据,还提供了丰富的数据可视化功能和完备的PythonAPI函数。本文将分享如何使用Python从维基百科抓取城市数据,然后自动填充到SeaTable表中,并使用SeaTable表的可??视化插件自动生成地图、图库等,下图是基本的冬奥会主办城市的形式。任务目标:通过各个城市的维基百科链接,找到该城市对应的地理位置(经纬度)填入“经纬度”字段,并从维基百科下载一张该城市的宣传图片,并上传到“城市形象”领域。自动获取城市的经纬度到表格的“经纬度”字段,从网页中获取信息,需要一些简单的python爬虫技术。该任务是使用requests和beatifulsoup的Python模块实现的。requests模块可以模拟在线请求,返回一段htmlDOM树。Beatifulsoup可以通过解析DOM树获取标签中想要的信息。以维基百科中某城市的经纬度为例,DOM树的结构如下:只要是在网页中可以看到的信息,都可以通过DOM树的源码查询到它所在的位置,通过简单的分析就可以提取出想要的位置。你想要的内容。具体分析方法可以参考beautifulsoup文档。下面是一段通过url解析其经纬度信息的代码:importrequestsfrombs4importBeautifulSouurl="https://en.wikipedia.org/wiki/Chamonix"#维基百科的城市链接#请求链接,获取其内容,网页内容是一段DOM树resp=requests.get(url)#将获取的内容加载到beatifulsoup解析器中进行解析soup=BeautifulSoup(resp.content)#纬度,找到DOM属性类为经度的结构体,并得到它的标签值lon=soup.find_all(attrs={"class":"longitude"})[0].string#Longitude,找到DOM属性类为latitude的结构体,得到它的标签值lat=soup.find_all(attrs={"class":"latitude"})[0].string上面找到的经纬度格式是标准的地理格式,写成45°55′23.16″N,6°52′10.92″E,并且存储在SeaTable表中需要转换成十进制格式写入。这里需要写一个转换逻辑来进行转换。自动获取城市图片到表格的“城市图片”字段。这个任务除了要知道经纬度信息外,还需要下载一张图片传给表单。同样的,图片和经纬度一样,也可以在DOM树中显示找到它的原始信息:img标签的src值就是我们需要的下载链接。结合SeaTableAPI的文件操作,可以方便的下载图片并上传到表中。以下是该任务的完整代码:importrequestsfrombs4importBeautifulSoupimportrefromseatable_apiimportBase,contextimportosimporttime'''该脚本演示从维基百科城市数据中提取冬奥会相关内容,解析并转换为seatable表中填写的case数据包括地理位置的经纬度,代表图片'''SERVER_URL=context.server_urlor'https://cloud.seatable.cn/'API_TOKEN=context.api_tokenor'cacc42497886e4d0aa8ac0531bdcccb1c93bd0f5'TABLE_NAME="以前的场地"URL_COL_NAME="维基百科城市链接"CITY_COL_NAME="主办城市"POSITION_COL_NAME="纬度和经度"IMAGE_COL_NAME="城市形象"defget_time_stamp():returnstr(int(time.time()*10000000))classWiki(object):def__init__(self,authed_base):self.base=authed_baseself.soup=Nonedef_convert(self,tude):#将经纬度格式转换为十进制格式,比较方便用于填写表格。multiplier=1iftude[-1]in['N','E']else-1returnmultiplier*sum(float(x)/60**nforn,xinenumerate(tude[:-1]))def_format_position(self,corninate):format_str_list=re.split("°|′|″,corninate)如果len(format_str_list)==3:format_str_list.insert(2,"00")returnformat_str_listdef_get_soup(self,url):#初始DOM解析器resp=requests.get(url)soup=BeautifulSoup(resp.content)self.soup=soupreturnsoupdefget_tu_position(self,url):soup=self.souporself._get_soup(url)#解析网页的DOM,取出经纬度的数值,返回十进制lon=soup.find_all(attrs={"class":"longitude"})[0].stringlat=soup.find_all(attrs={"class":“纬度”})[0].stringconverted_lon=self._convert(self._format_position(lon))converted_lat=self._convert(self._format_position(lat))返回{“lng”:converted_lon,“lat”:converted_lat}defget_file_download_url(self,url):#解析一个DOM,取出其中一个图片的下载链接soup=self.souporself._get_soup(url)src_image_tag=soup.find_all(attrs={"class":"infoboxib-settlementvcard"})[0].find_all('img')src=src_image_tag[0].attrs.get('src')return"https:%s"%srcdefhandle(self,table_name):base=self.base用于base.list_rows(table_name)中的行:尝试:url=row.get(URL_COL_NAME)如果不是url:继续row_id=row.get("_id")position=self.get_tu_position(url)image_file_downlaod_url=self.get_file_download_url(url)extension=image_file_downlaod_url.split(".")[-1]image_name="/tmp/wik-image-%s-%s.%s"%(row_id,get_time_stamp(),extension)resp_img=请求.get(image_file_downlaod_url)与open(image_na我,'wb')asf:f.write(resp_img.content)info_dict=base.upload_local_file(image_name,name=None,relative_path=None,file_type='image',replace=True)row_data={POSITION_COL_NAME:position,IMAGE_COL_NAME:[info_dict.get('url'),]}base.update_row(table_name,row_id,row_data)os.remove(image_name)self.soup=None除了异常为e:print("error",row.get(CITY_COL_NAME),e)defrun():base=Base(API_TOKEN,SERVER_URL)base.auth()wo=Wiki(base)wo.handle(TABLE_NAME)if__name__=='__main__':run()的表结果脚本自动化写入数据,可以看出,相比于在线查询然后手动填写每一行数据,脚本自动化可以节省大量的时间,而且准确高效使用SeaTable的地图插件自动生成城市地图有了前面获取到的城市经纬度信息,我们就可以在SeaTable表格的“插件”栏中一键添加地图插件,然后直接点击根据“经纬度”字段创建地图城市自动标注在地图上。并且还可以标记不同的标签颜色,设置直接和浮动的显示字段等。比起在表格中单调地看每个城市,通过地图可视化显然更加生动直观。使用SeaTable的图库插件可视化城市图片图库插件也可以放在表格工具栏中,方便随时打开查看。在图库插件的设置中,您还可以根据表单中的“城市图片”字段,通过简单的点击,以图库的形式显示图片,还可以设置标题名称等显示字段.这比浏览表格中的小图片更加美观和方便,大大提高了浏览体验。并点击图片放大。点击标题也可以直接进入查看和编辑其在表格中的行内容。此外,表单还支持灵活的分享和协作权限控制,可以满足细致多样的分享场景。比如你想直接把地图和图库分享给其他人查看,也可以直接在表单插件的外部应用中添加“地图”和“图库”。更多用法大家可以自行体验,这里就不多介绍了。总结作为一种新型的协同表格和信息管理工具,SeaTable不仅功能丰富,而且使用方便。通常,我们在使用Python实现一些程序时,可以灵活组合SeaTable表的功能,从而节省编程、开发、维护等时间和人力成本,快速方便地实现更有趣的东西和更完美的应用。它还使工具的使用更有价值。
