写了一个关于 worldmeter.info 的爬虫
本帖最后由 hoochanlon 于 2023-4-27 10:40 编辑worldometerworldometer是一个提供关于人口、政府、经济、社会、媒体、环境、食物、水、能源和健康的世界实时统计数据的网站。实时数据,一时半会没什么用,看个乐子,但如果我们想它保存为季度、年度的分类,再做点数据分析可视化,那价值还挺高的。基于这个想法,我才做的这方面的爬虫。
这是第三次写python脚本了吧,第一次是jupyter测试写笔记、玩玩简单数据可视化,第二次是NTFS for Mac,第三次就爬虫这次了,之后再此基础上,整点数据可视化的东西看看效果。
爬虫csv效果(仅39、40,略有瑕疵,删掉多余 `=-` ,问题不大)
![](https://s2.xptou.com/2023/04/27/64495cb2a2439.png)
本地及在线测试图
![](https://s2.xptou.com/2023/04/27/6449ce821f7d9.png)
在线测试
`python -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/ihs-simple/main/d-python/get_worldometers.py)"`
![](https://s2.xptou.com/2023/04/27/6449d3d319821.png)
**Windows运行的话,一般是在c:/Windows/System32或自己的家目录**
附源码:https://github.com/hoochanlon/ihs-simple/blob/main/d-python/get_worldometers.py
```python
from selenium import webdriver
from bs4 import BeautifulSoup
import csv
from datetime import datetime
# 参考
# BS文档:https://beautifulsoup.cn
# selenium:https://selenium-python-zh.readthedocs.io/en/latest/index.html
# ------------- webUI初始化配置 ----------------------------
driver = webdriver.Chrome()
driver.get("https://www.worldometers.info/cn/")
# 获取网页源码并传给 BeautifulSoup 解析
soup = BeautifulSoup(driver.page_source, 'html.parser')
# ------------将获取的数据提取出特定列,并写入到创建的csv------------- #
# 查找所有 <span class=item /> 与 <span class=rts-counter />
current_population_words = soup.find_all('span',class_='item')
current_population_num = soup.find_all('span',class_='rts-counter')
# ---------- 新增:以时间作为文件名后缀(2023-4-26) ---------------
# 获取当前时间
now = datetime.now()
# 将时间格式化为指定的字符串格式
formatted_time = now.strftime('%Y-%-m-%-d')
# ------------ 将获取的数据提取出特定列 ---------------------------
# 重复值标记
duplicate_value = 1
# 下标数以current_population_num为准
num_elements = len(current_population_num)
# 创建一个名为 "output.csv" 的 CSV 文件(旧)
# {} 占位符,在字符串中使用 {},在 .format() 中传入相应的变量或者值来替换它
with open("worldometers_{}.csv".format(formatted_time), "w", newline='', encoding='utf-8-sig') as csvfile:
# 指定列名
fieldnames = ['Column A','Column B']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
# 写入表头
writer.writeheader()
for i in range(num_elements):
duplicate_value = duplicate_value+1
if duplicate_value == 52:
continue
row_data = {'Column A': current_population_words.text, 'Column B': current_population_num.text}
writer.writerow(row_data)
```
## worldmeter后记
### 缘起
一开始本打算写开放研究论文综合搜索 (https://core.ac.uk) 的批量下载并匹配文献书名的爬虫,但后来一想,自己似乎没什么实质性的必要。以前看知网、复印刊、院校报(社科版)的比较多,后来随着工作与生活中的琐事所占时间越来越多,相对来说逐渐慢慢地也看得少了,一个月下来,平时偶尔看了一两篇就不错了。
举个例来说,就以[陈武元-《日本高等教育与经济发展的关系》](https://core.ac.uk/download/pdf/41446488.pdf) 链接为例
* https://core.ac.uk/download/pdf/41446488.pdf
* https://core.ac.uk/reader/41446488
download、reader都挺有规律性的,将“41446488”改成 core.ac.uk/reader/41446487,就是《日本高等教育改革的动向》的论文。也挺适合爬的,但没这么做,原因前面也说了。后来搜集统计相关的资料,找到了(https://cn.knoema.com)、(https://www.worldometers.info/cn/),看到(https://www.worldometers.info/cn/)实时动态数据也还不错,但没做年度报表,那么就让我帮他写一个吧。
### 遇到三个主要问题
**跨语言快速上手例子的选择上**
(https://blog.51cto.com/u_15743016/5549456),倒是给我启发还蛮大的,因为网上搜的例子稍较复杂,基础例子又太过“敷衍”了。从它的给出例子,再看看(https://beautifulsoup.cn)、(https://selenium-python-zh.readthedocs.io/en/latest/index.html),代码编写与调试的起步就舒服多了。
**获取网站动态内容的延迟问题**
在requests与time.sleep配合依旧是“获取数据中”的状态,那就以慢制慢咯,反爬也随缘处理,使用 webUI自动化来解决了。还有参考了(https://www.cnblogs.com/feffery/p/9570171.html)、(https://blog.csdn.net/qq_52661119/article/details/119854694)也是让我选择webUI自动化的原因。
![](https://s2.xptou.com/2023/04/27/6449cac7b4486.png)
**下标数据存在重复项及其解决方案选取问题**
"Abortions this year"的中文项span class索引52存在重复的问题,英文版没有;但也存在其他class值选取上的难点。根据代码运行测试观察发现,只要做个标记值用`if continue`就好了。至于其他xlsx、csv追加、拼接、文件合并,调试起来有些麻烦,尤其是在Mac上,难说vb行不行得通,对于我来说不太适用,自己也不大喜这偏方。
注意源码的`current_population_words = soup.find_all('span',class_='item')`与 `if continue` 部分
简中版
![](https://s2.xptou.com/2023/04/27/6449c6c2606f7.png)
原版
![](https://s2.xptou.com/2023/04/27/6449c770d6430.png)
### 跨语言的综合感受
个人方面,跨语言有时语法搞混,对我来说相对次要,毕竟不是考试背板做题;混乱感受实际上跟你切macOS/win10 UI及快捷键有点类似,一般都是用到才拿出来,适应一小段时间就好了。通常来说,备手基础文档,然后就是一个例子之类的,之后再结合自己的想法,接下来就是,如何去变通与实现了。
写python爬虫和shell/batch自动化,算是两个不同方向吧。python爬虫偏向于web浏览器,涉及html/css/js 之类,以及网络应用层等方面的知识;网络方面,自己也仅是略知皮毛而已,大部分时间还是要查资料;而shell、batch就偏向系统软件、存储文件属性这方面。说难度吧,shell/batch好方便入手,其实也是看谁方便用谁,明确知道自己想要什么,就行。但往深了走,实际上没什么行业又是不难的。 感谢分享python爬虫经验~ 感谢大表哥分享,收藏 感谢分享,学习了 感谢分享,学习一下
感谢分享{:1_927:} 学习一下 之后考虑可视化,提前准备一些素材
* https://matplotlib.org/stable/gallery/index.html
* https://seaborn.pydata.org/examples/index.html
国内模版,待定。测过了之后再说。 本帖最后由 hoochanlon 于 2023-4-29 13:28 编辑
Windows和Mac调用Excel内部功能的库是不同的,不能保证共用,那么全平台通用就到这部分为止吧。
```
# ------------新增:删除多余字符,并另存为xlsx (2023-4-29)--------------
# 1. csv可操作性不如Excel,故另存为xlsx。
# 2. 将文本数值转换为数值反倒远不如Excel方便,PASS。
# 读取CSV文件
df = pd.read_csv("worldometers_{}.csv".format(formatted_time))
# 定位到39、40行A列并删除-=符号
df.loc = df.loc.apply(lambda x: x.replace('-=', ''))
# 将修改后的数据保存为xlsx文件
df.to_excel("worldometers_{}.xlsx".format(formatted_time), index=False)
# 删除原始CSV文件
os.remove("worldometers_{}.csv".format(formatted_time))
``` 感谢分享
页:
[1]