响应群友的小企鹅表情包,我全要了

本文介绍了如何使用Selenium和requests库实现爬取Bing搜索结果中的小企鹅图片,包括页面滚动、处理iframe、定位图片并下载的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本章,响应群友需求,搞一搞小企鹅的图0b89e7c489fedcd5c44b8a32e2a50add.png

看起来嘎嘎可爱,不小心就爬完了它。一起来看看代码,文末附源码地址。

首先,你需要百度,找到一个有很多小企鹅图的网站.c0f07f2b3d0dd30de24a58049b92ef26.jpeg我找了半天,也就找到个这个:

https://cn.bing.com/images/search?q=%E5%B0%8F%E4%BC%81%E9%B9%85%E8%A1%A8%E6%83%85%E5%8C%85&qpvt=%E5%B0%8F%E4%BC%81%E9%B9%85%E8%A1%A8%E6%83%85%E5%8C%85&first=1

不过问题不大,不影响我们分析,并且获取它啊。

技术栈

本章使用selenium+requests来获取。为什么使用selenium,因为昨晚上有粉丝问了selenium相关的问题,所以直接上手吧。

第一步-导包并打开网址

import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

fox = webdriver.Firefox()
fox.get(
    "https://cn.bing.com/images/search?q=%E5%B0%8F%E4%BC%81%E9%B9%85%E8%A1%A8%E6%83%85%E5%8C%85&qpvt=%E5%B0%8F%E4%BC%81%E9%B9%85%E8%A1%A8%E6%83%85%E5%8C%85&first=1")

因为我是写完后才写的文章,所以提前知道了需要哪些包,不必在意为什么我一下子知道需要哪些包。

第二步-分析网址情况

d2542cac40ccc749e27d70f19e6e3e45.gif

如动图所示,下拉过程中,会不断的刷新界面,所以我们第二步需要做的就是解决掉界面刷新情况,如何下拉,并一直到底部。

怎么做?看代码

while True:
    down = "window.scrollTo(0, document.body.scrollHeight)"
    fox.execute_script(down)
    time.sleep(2.5)
    # 使用 JavaScript 判断是否已经滚动到底部
    is_bottom = fox.execute_script(
        'return (window.innerHeight + window.scrollY) >= document.body.offsetHeight;'
    )
    if is_bottom:
        break

先下拉,等待2.5S时间,用于加载DOM,避免误操作。然后判断滚动条高度,直到高度先等,退出循环。

第四步-定位图片

上述步骤DOM已经加载完毕后,定位第一张图,点击打开它。dd5ba34397ad4ee45b31f71116faa2ca.png点击进去后,再看:cd3a26d671851a88fb19ae9ee552c2ec.png可以看到src出来了,那么接下来就是获取这个src了,同样,需要分析一下HTML。最后发现,在这个界面的上层有一个iframe框架。766dd11254488611bea3d9b5cf5cb16e.png

接下来要做的就是定位这个iframe,切换进去,然后定位img,获取属性src,一气呵成

Frame = fox.find_element(By.XPATH, "//*[@id='OverlayIFrame']")
fox.switch_to.frame(Frame)
time.sleep(2)
num = 0
while True:
    srcs = fox.find_elements(By.XPATH, "//*[@class='imgContainer']/img")[0]
    src_ = srcs.get_attribute("src")

用到while是因为有很多这样的src需要获取,所以,知道有很多个src需要获取,那么如何跳转到下一张图片呢?860facd7530a0ec14ee723a4032cc79d.png没错,就是它了,定位它,在获取到本章图片的src后,并发起请求,获取图片信息并下载,就可以点击下一张了,并重复这样的操作,直到异常,没有图片了,我们就退出。

res = requests.get(src_)
    with open(f"{str(num)}.jpg", "wb") as w:
        w.write(res.content)
        num += 1
    try:
        fox.find_element(By.XPATH,'//div[@id="navr"]/span').click()
    except:
        print("结束")
        fox.quit()


因为没有反爬,所以写的比较简单,图片数量不多,下载速度也还行,没有写入多线程了,

最后:代码地址:文件名:小企鹅.py

斗图 · 清安无别事/爬虫案例 - 码云 - 开源中国 (gitee.com)

内容概要:本文深入探讨了利用MATLAB/Simulink搭建变压器励磁涌流仿真模型的方法和技术。首先介绍了空载合闸励磁涌流仿真模型的搭建步骤,包括选择和配置电源模块、变压器模块以及设置相关参数。文中详细讲解了如何通过代码生成交流电压信号和设置变压器的变比,同时强调了铁芯饱和特性和合闸角控制的重要性。此外,还讨论了电源简化模型的应用及其优势,如使用受控电压源替代复杂电源模块。为了更好地理解和分析仿真结果,文章提供了绘制励磁涌流曲线的具体方法,并展示了如何提取和分析涌流特征量,如谐波含量和谐波畸变率。最后,文章指出通过调整电源和变压器参数,可以实现针对不同应用场景的定制化仿真,从而为实际工程应用提供理论支持和技术指导。 适合人群:从事电力系统研究、变压器设计及相关领域的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解变压器励磁涌流特性的研究人员,旨在帮助他们掌握MATLAB/Simulink仿真工具的使用技巧,提高对励磁涌流现象的理解和预测能力,进而优化继电保护系统的设计。 其他说明:文中不仅提供了详细的建模步骤和代码示例,还分享了一些实用的经验和技巧,如考虑磁滞效应对涌流的影响、避免理想断路器带来的误差等。这些内容有助于读者在实践中获得更加准确可靠的仿真结果。
<think>好的,我现在需要帮用户解决如何使用企业微信机器人发送Markdown消息并@群友的问题,而且用户只知道群友的手机号码。首先,我得回忆一下企业微信机器人的相关API和功能。 企业微信机器人确实支持发送Markdown格式的消息,这点我记得没错。但是@群友的话,通常需要用户的userid,或者直接在消息内容里用@符号加上用户名。不过用户这里只有手机号,可能需要先通过手机号找到对应的userid。 首先,发送Markdown消息的API应该是通过webhook地址,构造一个POST请求,内容里指定msgtype为markdown,然后在markdown字段里写内容。关于@用户的部分,企业微信的文档里提到,可以在markdown内容中使用<@userid>来@特定用户,但需要先获得用户的userid。问题在于用户只有手机号,所以可能需要先调用企业微信的API根据手机号查找userid。 接下来,我需要确认企业微信是否有根据手机号获取userid的接口。查阅企业微信的API文档,用户信息相关的接口中,有一个“手机号获取userid”的接口,属于通讯录管理部分。这个接口需要access_token,而获取access_token需要企业的corpid和secret。这意味着用户需要有通讯录管理的权限,并且获取到相应的secret才能调用这个接口。 所以流程大致是:1. 根据手机号获取userid;2. 构造Markdown消息,使用<@userid>来@用户;3. 发送消息到群聊。需要注意的是,机器人必须已经添加到目标群聊中,并且有发送消息的权限。 另外,发送消息时,@的用户需要属于该群,否则可能无法正确@。同时,手机号必须是用户在企业微信中绑定的已验证手机号,否则可能无法通过手机号查找到userid。还有,如果用户不在群里,即使有userid,发送时也不会成功@,这点需要用户确认。 现在要整理步骤,首先获取userid的部分,给出示例代码或者curl命令,然后构造Markdown消息。可能用户对API调用不熟悉,需要给出具体的代码示例,比如使用Python的requests库。同时提醒用户替换关键的参数,如corpid、secret、手机号、webhook的key等。 在构造Markdown内容时,正确使用<@userid>的格式,并且确保在text字段里也有提及,因为某些客户端可能不支持markdown格式的@。不过根据企业微信的文档,markdown类型消息支持@群成员,只要在content里正确使用语法,并且在mentioned_list里填入userid列表。但需要确认,是否在发送Markdown消息时,需要同时填写mentioned_list字段,还是说只需要在内容中用<@userid>。这点可能需要再次查阅文档。 例如,发送文本消息时,可以通过mentioned_list来@用户,但Markdown消息是否支持这个字段?或者是否需要同时在内容和mentioned_list里指定?可能不同的消息类型处理方式不同,需要明确。 根据企业微信的官方文档,发送Markdown消息时,@用户的正确方式是在markdown内容中使用<@userid>,并且不需要在mentioned_list里重复指定。例如: { "msgtype": "markdown", "markdown": { "content": "欢迎<@userid1>和<@userid2>加入群聊!" } } 这样发送后,用户会被正确@。所以用户需要先在内容里写好这些标签,而手机号需要先转成userid。 总结步骤: 1. 获取access_token:使用corpid和通讯录secret调用接口获取。 2. 根据手机号获取userid:使用手机号调用相应的API,得到userid。 3. 构造Markdown消息,在内容中使用<@userid>。 4. 通过机器人的webhook URL发送POST请求。 现在需要考虑代码示例的结构,分步骤展示,并处理可能的错误,比如手机号无效或用户不在群里等。同时,用户可能需要多个手机号的处理,比如多个@,代码需要遍历手机号列表,逐个获取userid,并拼接成Markdown内容。 此外,用户可能需要知道如何获取corpid和secret,以及如何创建企业微信机器人。创建机器人是在群聊中添加,然后获得webhook URL,其中包含key参数,用于构造最终的webhook地址。 最后,提醒用户注意权限问题,比如通讯录接口的调用需要管理员权限,以及确保机器人已经正确添加到群中。</think>### 分步解决方案 #### 步骤 1:获取用户userid 企业微信需要通过手机号查询用户userid,需调用企业微信API接口: 1. **获取access_token** 调用接口: `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=YOUR_CORPID&corpsecret=YOUR_SECRET` 返回结果中的`access_token`用于后续操作。 2. **通过手机号获取userid** 调用接口: `https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=ACCESS_TOKEN` 发送POST请求,Body为手机号: ```json { "mobile": "13800138000" } ``` #### 步骤 2:构造Markdown消息 企业微信机器人支持Markdown格式,但需在内容中使用`<@userid>`语法@群友。 **示例代码(Python)**: ```python import requests # 1. 根据手机号获取userid(需企业微信通讯录权限) def get_userid(mobile, access_token): url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=" + access_token response = requests.post(url, json={"mobile": mobile}) return response.json().get("userid") # 2. 发送Markdown消息 def send_markdown_message(content, webhook_url): data = { "msgtype": "markdown", "markdown": { "content": content } } response = requests.post(webhook_url, json=data) return response.json() # 参数配置 corpid = "YOUR_CORPID" corpsecret = "YOUR_SECRET" mobile = "13800138000" # 目标用户手机号 webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_ROBOT_KEY" # 获取access_token token_response = requests.get(f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}") access_token = token_response.json().get("access_token") # 获取userid userid = get_userid(mobile, access_token) # 构造Markdown内容(使用<@userid>语法) markdown_content = f"通知:<@{userid}>,请查收今日任务清单。\n\n- 任务1:完成报告\n- 任务2:提交审核" # 发送消息 send_markdown_message(markdown_content, webhook_url) ``` #### 步骤 3:注意事项 1. **权限要求** - 需要企业微信管理员权限获取`corpid`和`corpsecret`[^4]。 - 机器人需提前添加到目标群聊中。 2. **手机号匹配** 手机号必须与企业微信通讯录中用户绑定的**已验证手机号**一致。 3. **@生效条件** 被@的用户必须在目标群聊中,否则标记无效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清安无别事

慢慢的积累一杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值