作为父亲的失职
现在是凌晨三点半,我完成了今天的文章。之所以熬这么晚,主要是因为我这一对儿不听话的双胞胎。
今天孩子幼儿园发来了一张身心发展评价表,其中有一项社会文化的栏目,他俩都是一颗星(差),其中涉及的内容有:
会朗读和演唱简单的民间歌曲,喜欢听世界著名童话故事,能认识1-2个邻国的国旗。
他俩这项都是差让我有些愧疚,自问平时工作太忙,偶尔回家早些也想躺着玩会儿手机,陪孩子的时间不多。所谓子不教父之过,那么针对这个差我能做些什么?大概能认识1-2个邻国的国旗这项比较容易
数据获取
在网上翻了翻,找到一个统计国家、国旗、人口、面积的网站:
http://114.xixik.com/country-flag/
本来想着直接从第二张图的位置去获取,但发现国旗是缩略图,太小看不清。所以只好把这两张图拼接一起。通过国家名字进行关联了…
说干就干…
网站分析
网站总体来说比较简单,统一的样式通过class的lindBox
即可获取,下图微网站结构拼接图:
图片的下载和国家数据分别在第6个和第7个lindBox
,对应index的5,6
图片解析img的src一级td的text,将名字对应保存即可
国家数据就更简单了直接for循环所有tr,使用正则格式化下就OK了
批量下载与存储
图片下载使用request.get(url)获取二进制数据,之后写入文件即可,至于目录,我们放在static/images
下,至于为什么放这个目录,一会儿说…
国家数据由于不多,所以直接使用SQLite存储即可(其实存文本也行,但不方便后面使用)…
梳理OK,上代码:
# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清风Python
# @Date : 2019/6/11 2:19
# @Software : PyCharm
# @version :Python 3.6.8
# @File : CountryFlagCrawler.py.py
import requests
from bs4 import BeautifulSoup
import re
import os
from db_maker import DB_Maker as DB
class CountryFlagCrawler:
def __init__(self):
self.url = "http://114.xixik.com/country-flag/"
self.headers = {
'Host': "114.xixik.com",
'Connection': 'keep-alive',
'user-agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')
}
self.db = DB()
self.save_path = 'static/images'
def check_dir(self):
if not os.path.exists(self.save_path):
os.mkdir(self.save_path)
def get_response(self, url, params=None):
r = requests.get(url, headers=self.headers, params=params)
r.encoding = 'gb2312'
soup = BeautifulSoup(r.text, "lxml")
return soup
def down_load_flag(self):
soup = self.get_response(self.url)
tds = soup.findAll("div", {
"class": "lindBox"})[5].findAll("td")
for td in tds:
try:
picture_url = td.find('img')['src']
country_name = '%s.gif' % re.sub('\s', '', td.text)
print("Download %s" % country_name)
r = requests.get(picture_url)
with open(os.path.join(self.save_path, country_name), 'wb') as f: