首页 > 编程语言 >Python中使用xpath一键获取各国国旗

Python中使用xpath一键获取各国国旗

时间:2022-12-28 17:34:04浏览次数:33  
标签:xpath Python items self 一键 selector tr url td

国旗是一个国家的主权意识不断增强后必然的产物,国旗是国家的一种标志性旗帜,是国家的象征。代表着一个国家的主权和民族的尊严。


每个国家的国旗都由特有的颜色和图案构成,这些颜色和图案代表着这个国家的历史、文化、信仰、政治、经济和民族精神。


比如中国国旗:红色代表鲜血,象征革命,五星呈黄色,象征光明璀璨。大星代表中国共产党,四颗小星代表工人、农民、知识分子、民族资产阶级。四颗小星环绕大星,各有一个角对着大星的中心象征中国共产党领导下的革命人民大团结和人民对党的拥护。

Python中使用xpath一键获取各国国旗_.net

自从新航路的开辟后世界就连成了一个整体,经济也开始逐渐全球化发展,经济全球化促进了商品和资本流动,促进了科技和文明进步,更加促进了各国人民友好交往,国与国之间的贸易和交流也愈来愈多。


全球有近200个国家和地区,都有各自不同的文化和生活方式。不完全统计全世界有205种国旗,真是“乱花渐欲迷人眼”。


当你看到一面陌生国旗,却不知道它属于哪一个国家,有没有那么一瞬间想过要是自己认识世界上所有国旗该多好?

Python中使用xpath一键获取各国国旗_HTML_02

今天给大家介绍一个爬取七大洲所有的国家,以及每个国家的国旗、国土面积,以及国徽的爬虫案例,带你了解一下世界其他国家的情况。


话不多说,今天的案例链接:http://cn.flagbox.net。因该案例比较简单,所以具体的过程都在代码中,做出了详细的解释。代码如下:

# coding:utf-8
# __auth__ = "maiz"
import requests
from lxml import etree
import pandas as pd
import time
import os


class WorldFlag_Spider(object):


def __init__(self):
self.start_url = 'http://cn.flagbox.net/' # 网站根地址
self.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 FS"}
self.main_folder = r'世界各国和地区数据&国旗汇总' # 主路径
self.content_list = [] # 将包含数据的字典存放到这个列表


# 获取主链接
def data_range(self):
start_res = requests.get(url=self.start_url, headers=self.headers)
start_sel = etree.HTML(start_res.content.decode())
main_url_list = start_sel.xpath('//div[@id="page-bg"]/table/tr/td[2]/ul/li[position()<7]/a/@href')
main_url = ['http://cn.flagbox.net/' + i for i in main_url_list]
print(main_url)
return main_url


# 获取次链接
def get_url(self, url_1):
sec_res = requests.get(url=url_1, headers=self.headers)
sec_sel = etree.HTML(sec_res.content.decode())
s_link_list = sec_sel.xpath('//tr/td/a[2]/@href')
s_link = ['http://cn.flagbox.net/' + s for s in s_link_list]
return s_link


# 解析获取到的链接
def paser_url(self, url):
# print(url)
response = requests.get(url=url, headers=self.headers)
if response.status_code == 200:
selector = etree.HTML(response.content.decode())
return selector
else:
print('请求失败')


# 获取数据
def get_content_list(self, selector):
items = {}
try:
# 国名
items['国名'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[1]/td[2]/text()')
items['国名'] = items['国名'][0] if len(items['国名']) > 0 else None


# 面积
items['面积'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[3]/td[2]/text()')
items['面积'] = items['面积'][0] if len(items['面积']) > 0 else None


# 首都
items['首都'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[4]/td[2]/text()')
items['首都'] = items['首都'][0] if len(items['首都']) > 0 else None


# 所处位置
items['所处位置'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[5]/td[2]/text()')
items['所处位置'] = items['所处位置'][0] if len(items['所处位置']) > 0 else None


# 电话区号
items['电话区号'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[6]/td[2]/text()')
items['电话区号'] = items['电话区号'][0].replace(' /', '') if len(items['电话区号']) > 0 else None


# 货币名称
items['货币名称'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[8]/td[2]/text()')
items['货币名称'] = items['货币名称'][0] if len(items['货币名称']) > 0 else None


# 语言
items['语言'] = selector.xpath('//table[@style="border-collapse: collapse; "]/tr[14]/td[2]/text()')
items['语言'] = items['语言'][0] if len(items['语言']) > 0 else None


self.content_list.append(items)


return items['国名']
except IndexError:
pass


# 获取图片链接
def get_imagelink(self, selector):
# 国旗高清图片
f_picture = 'http://cn.flagbox.net/' + selector.xpath('//div[@id="page-bg"]/table/tr/td[1]/table/tr/td/ul/li[7]/a/@href')[0]


# 国旗高清图标
f_icon = 'http://cn.flagbox.net/' + selector.xpath('//div[@id="page-bg"]/table/tr/td[1]/table/tr/td/p/img[2]/@src')[0]


# 国徽链接
emblem = 'http://cn.flagbox.net/' + selector.xpath('//div[@id="page-bg"]/table/tr/td[1]/table/tr/td/p[@align="center"][2]/img/@src')[0]


return f_picture, f_icon, emblem


# 保存数据
def save_content_list(self, items):
pf = pd.DataFrame(self.content_list)
# 指定列的顺序
order = ['国名','面积','首都','所处位置','电话区号','货币名称','语言']
pf = pf[order]
# 打开excel文件
file_path = pd.ExcelWriter(self.main_folder + '/' + '世界各国和地区信息汇总.xlsx')
# 替换空单元格
pf.fillna(' ', inplace=True)
# 输出
pf.to_excel(file_path, encoding='utf-8', index=False,sheet_name="sheet1")
file_path.save()
print('正在保存:{}'.format(items))
# print(self.content_list)


# 下载图片
def download_image(self, links, item):
try:
# 创建子文件夹
folder = self.main_folder + '/' + item + '/'
if not os.path.exists(folder):
os.mkdir(folder)
for link in links:
with open(folder + link.split('/')[-2] + os.path.splitext(link)[-1], 'wb') as f:
image = requests.get(link, headers=self.headers).content
f.write(image)


# 用urllib.request模块进行下载:
# urllib.request.urlretrieve(link, folder + link.split('/')[-2] + os.path.splitext(link)[-1])
except:
print('保存失败')


def run(self):
# 创建主路径
if not os.path.exists(self.main_folder):
os.mkdir(self.main_folder)
# 1.获取各大洲网页链接
main_url = self.data_range()
# 2.遍历各大洲网页链接列表
for url_1 in main_url:
# 3.获取各个国家网页链接
s_link = self.get_url(url_1)
for url in s_link:
# 4.解析各个国家网页链接数据
selector = self.paser_url(url)
# time.sleep(1)
# 5.获取各国的各项数值
item = self.get_content_list(selector)
# 6.获取各国的国旗图片图标和国徽
links = self.get_imagelink(selector)
# 7.保存数据和下载图片
self.save_content_list(item)
self.download_image(links, item)




if __name__ == "__main__":
WorldFlag = WorldFlag_Spider() # 实例化对象
WorldFlag.run()



标签:xpath,Python,items,self,一键,selector,tr,url,td
From: https://blog.51cto.com/u_15924937/5975836

相关文章

  • Python一键查询 ICP 备案详情
    做搜索引擎优化的都时长面临一个问题,就是网站备案到底对seo是否有影响呢,今天将为大家仔细分析网站备案,到底对SEO有没有影响?首先说下网站备案的目的、是为了防止在网上从事......
  • 使用Python的asyncio模块异步下载整站壁纸
    这篇文章主要给大家介绍关于Python中asyncio模块的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学......
  • 使用python爬取B站视频
    B站之所以火,是因为趣味与知识并存。正如一句“你在B站看番,我在B站学习”,B站还是有一些质量比较好的学习视频。当你在B站上看到喜欢的视频想保存下来时,怎么办呢?我相信很多逛B......
  • Python 爬取人人视频
    hello,小伙伴们,又见面了,距离上一次发布文章的时间,也算是久别重逢了。期间也发生了很多的事情,导致博文断更,也是笔者不愿意的,但是确实是比较忙,不再过多赘述,希望大家能够体谅。......
  • Python爬取快手博主所有视频
    随着互联网经济的快速发展和自媒体行业的普及,越来越多的视频创作者加入了短视频平台,不仅快速的推动了短视频平台行业的发展,也给大众带来了更多新鲜有趣的知识和内容。据最新......
  • sublime安装REPL无法执行python3.7版本
    一、下载sublime最新版本地址:SublimeText-TextEditing,DoneRight单击DOWNLOADFORWINDOWS需要等一会儿自己就下载了。  安装就是下一步就可以了。二、安装......
  • python 使用thread多线程执行耗时代码
    python使用thread多线程执行耗时代码1、引入所需要的包importqueueimportthreadingimporttraceback2、定义线程类:classThreadService(threading.Thread):  de......
  • Python对象的比较和拷贝
    Python对象的比较和拷贝本文内容存在主观理解,详细请查阅官网文档比较(==VSis)==操作符是比较对象的值是否相等,而is比较的事对象的身份标识是否相等,即它们是否是同一......
  • tensorflow_probability.python.bijectors的一些使用
      网上见到一个TensorFlow的代码,没见过这个形式的,是概率编程的代码:#coding=utf-8#Copyright2020TheTF-AgentsAuthors.##LicensedundertheApacheLicens......
  • python中global 和 nonlocal 的作用域
    python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量。一globalglobal关键字用来在函数或其他局部作用域中使用全局变量。......