hoochanlon 发表于 2023-4-27 10:08

写了一个关于 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好方便入手,其实也是看谁方便用谁,明确知道自己想要什么,就行。但往深了走,实际上没什么行业又是不难的。

Flanders 发表于 2023-4-27 10:47

感谢分享python爬虫经验~

LuckyClover 发表于 2023-4-27 12:25

感谢大表哥分享,收藏

lianfeng520 发表于 2023-4-27 14:08

感谢分享,学习了

SpiritQAQ 发表于 2023-4-27 15:17

感谢分享,学习一下

daoshengshu 发表于 2023-4-27 15:21


感谢分享{:1_927:}

qiqi2050352 发表于 2023-4-27 15:43

学习一下

hoochanlon 发表于 2023-4-27 16:22

之后考虑可视化,提前准备一些素材

* https://matplotlib.org/stable/gallery/index.html
* https://seaborn.pydata.org/examples/index.html

国内模版,待定。测过了之后再说。

hoochanlon 发表于 2023-4-29 13:27

本帖最后由 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))
```

dcyxiaoxue 发表于 2023-5-5 20:14

感谢分享
页: [1]
查看完整版本: 写了一个关于 worldmeter.info 的爬虫