吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1518|回复: 9
收起左侧

[Python 原创] 写了一个关于 worldmeter.info 的爬虫

[复制链接]
hoochanlon 发表于 2023-4-27 10:08
本帖最后由 hoochanlon 于 2023-4-27 10:40 编辑

worldometerworldometer是一个提供关于人口、政府、经济、社会、媒体、环境、食物、水、能源和健康的世界实时统计数据的网站。实时数据,一时半会没什么用,看个乐子,但如果我们想它保存为季度、年度的分类,再做点数据分析可视化,那价值还挺高的。基于这个想法,我才做的这方面的爬虫。

这是第三次写python脚本了吧,第一次是jupyter测试写笔记、玩玩简单数据可视化,第二次是NTFS for Mac,第三次就爬虫这次了,之后再此基础上,整点数据可视化的东西看看效果。

爬虫csv效果(仅39、40,略有瑕疵,删掉多余 =- ,问题不大)

本地及在线测试图

在线测试

python -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/hoochanlon/ihs-simple/main/d-python/get_worldometers.py)"

Windows运行的话,一般是在c:/Windows/System32或自己的家目录

附源码:https://github.com/hoochanlon/ihs-simple/blob/main/d-python/get_worldometers.py

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[i].text, 'Column B': current_population_num[i].text}
        writer.writerow(row_data)

worldmeter后记

缘起

一开始本打算写开放研究论文综合搜索 core.ac.uk 的批量下载并匹配文献书名的爬虫,但后来一想,自己似乎没什么实质性的必要。以前看知网、复印刊、院校报(社科版)的比较多,后来随着工作与生活中的琐事所占时间越来越多,相对来说逐渐慢慢地也看得少了,一个月下来,平时偶尔看了一两篇就不错了。

举个例来说,就以陈武元-《日本高等教育与经济发展的关系》 链接为例

download、reader都挺有规律性的,将“41446488”改成 core.ac.uk/reader/41446487,就是《日本高等教育改革的动向》的论文。也挺适合爬的,但没这么做,原因前面也说了。后来搜集统计相关的资料,找到了knoemaworldometers,看到worldometers实时动态数据也还不错,但没做年度报表,那么就让我帮他写一个吧。

遇到三个主要问题

跨语言快速上手例子的选择上

51cto-静态网页爬虫①,倒是给我启发还蛮大的,因为网上搜的例子稍较复杂,基础例子又太过“敷衍”了。从它的给出例子,再看看BS官方文档selenium官方文档,代码编写与调试的起步就舒服多了。

获取网站动态内容的延迟问题

在requests与time.sleep配合依旧是“获取数据中”的状态,那就以慢制慢咯,反爬也随缘处理,使用 webUI自动化来解决了。还有参考了cnblogs -(数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)csdn-基于python爬虫—静态页面和动态页面爬取也是让我选择webUI自动化的原因。

下标数据存在重复项及其解决方案选取问题

"Abortions this year"的中文项span class索引52存在重复的问题,英文版没有;但也存在其他class值选取上的难点。根据代码运行测试观察发现,只要做个标记值用if continue就好了。至于其他xlsx、csv追加、拼接、文件合并,调试起来有些麻烦,尤其是在Mac上,难说vb行不行得通,对于我来说不太适用,自己也不大喜这偏方。

注意源码的current_population_words = soup.find_all('span',class_='item')if continue 部分

简中版

原版

跨语言的综合感受

个人方面,跨语言有时语法搞混,对我来说相对次要,毕竟不是考试背板做题;混乱感受实际上跟你切macOS/win10 UI及快捷键有点类似,一般都是用到才拿出来,适应一小段时间就好了。通常来说,备手基础文档,然后就是一个例子之类的,之后再结合自己的想法,接下来就是,如何去变通与实现了。

写python爬虫和shell/batch自动化,算是两个不同方向吧。python爬虫偏向于web浏览器,涉及html/css/js 之类,以及网络应用层等方面的知识;网络方面,自己也仅是略知皮毛而已,大部分时间还是要查资料;而shell、batch就偏向系统软件、存储文件属性这方面。说难度吧,shell/batch好方便入手,其实也是看谁方便用谁,明确知道自己想要什么,就行。但往深了走,实际上没什么行业又是不难的。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Flanders + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

感谢分享
qiqi2050352 发表于 2023-4-27 15:43
学习一下
 楼主| hoochanlon 发表于 2023-4-27 16:22

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

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

 楼主| 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[38:39, 'Column A'] = df.loc[38:39, 'Column A'].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
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 01:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表