Python爬取公众号封面图(零基础也能看懂)

📚博客主页:knighthood2001
公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下)
🎃知识星球:【认知up吧|成长|副业】介绍
❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️
🙏笔者水平有限,欢迎各位大佬指点,相互学习进步!

需求:平时一些公众号文章封面图比较好,想获取一下。因此写了这个脚本。

前言

打开一篇公众号,右键,查看网页源代码
在这里插入图片描述
其中,你可以通过ctrl+F进行关键字搜索。
msg_cdn_url对应的链接就是微信公众号封面图,比如
在这里插入图片描述

cdn_url_1_1对应的链接就是没有裁剪的公众号封面图,比如
在这里插入图片描述
可以发现cdn_url_1_1对应的链接图片资源完整一些。
因此我选择爬取这个图片,也就是找cdn_url_1_1所对应的网址

爬取思路

  • 首先,图片是以网址形式给出,因此需要从网址中把图片保存为本地文件。
  • 其次,我需要从网页源代码中筛选出该网址,可以使用re正则表达式进行该操作。

预备知识

可以先看一下我写的这两篇文章,因为代码都是逐渐往上加内容,才实现最终功能的,你可以理解为搭积木。
Python爬取网页源代码(自用)
Python下载爬取到的图片链接
Python获取当前时间戳

通过正则表达式筛选内容

除了以上内容,下面代码是今天要学的,其功能就是正则表达式获取公众号封面图所在的网址,通过查找网页源代码,cdn_url_1_1只出现了一次,因此可以直接通过re模块进行筛选。

import requests
import re
# 定义目标网页的URL
url = 'https://mp.weixin.qq.com/s/d7DUHB-hT8DExjpxsEncQw'

# 发送GET请求获取网页内容
response = requests.get(url)

# 检查响应状态码,200表示请求成功
if response.status_code == 200:
    # 输出网页源代码
    print(response.text)

    # 定义包含目标网址的字符串
    source_code = response.text
    # 使用正则表达式提取网址
    # url_pattern = re.compile(r'cdn_url_1_1\s*=\s*"(.*?)"')
    url_pattern = re.compile(r'cdn_url_1_1 = "(.*?)"')
    matches = url_pattern.findall(source_code)
    # 输出提取到的网址
    if matches:
        print(matches[0])
    else:
        print("No URL found.")

matches返回的是一个列表,因此需要添加[0],表示取第一个。运行结果如下,返回的就是公众号封面的图片网址。

https://mmbiz.qpic.cn/sz_mmbiz_jpg/n3WJwMGdIpnGSMHew0kcnsEk8Y9icBG8EBh8ib6qBBZmJR8DgkZookgGWVuibTgsUrIPiatfiafNI8N1dR4uhI086UA/0?wx_fmt=jpeg

本文正则表达式的解释

此外,对于这个正则表达式 cdn_url_1_1\s*=\s*"(.*?)" 可以分为几个部分来解释:

  1. cdn_url_1_1:匹配字符串中的 cdn_url_1_1,它是要匹配的目标字符串的一部分。
  2. \s*:匹配零个或多个空白字符,包括空格、制表符、换行符等。
  3. =:匹配一个等号字符。
  4. \s*:再次匹配零个或多个空白字符。
  5. ":匹配一个双引号字符。双引号是开始网址的标记。
  6. (.*?):这是一个捕获组,用于捕获双引号内的内容。.*? 匹配任意字符(除换行符外)零次或多次,非贪婪模式,即匹配到第一个双引号结束。
  7. ":再次匹配一个双引号字符。双引号是结束网址的标记。

因此,整个正则表达式的作用是匹配形如 cdn_url_1_1 = "..." 这样的字符串,并捕获其中双引号内的网址部分。
为了更加简单,你也可以写成cdn_url_1_1 = "(.*?)"

全文代码

通过搭积木的方式,将以上代码整合起来,具体代码如下:

import requests
import re
import os
#TODO 使用时间戳当作文件名称
def get_time():
    import time
    timestamp = int(time.time())
    return timestamp
#TODO 实现从网页图片保存到本地,输入为图片网址和保存路径
def image_save(image_url, path):
    if not os.path.exists(path):         # 如果文件夹不存在,则创建
        os.makedirs(path)

    # 发送 GET 请求获取图片数据
    response = requests.get(image_url)
    # 确保请求成功
    if response.status_code == 200:
        image_name = get_time()
        image_name = "{}.jpg".format(image_name)
        # 指定图片保存路径
        save_path = os.path.join(path, image_name)  # 这里将图片保存在名为 images 的文件夹中
        # 将图片数据写入文件
        with open(save_path, 'wb') as f:
            f.write(response.content)
        print(f'图片已保存为: {save_path}')
    else:
        print(f'下载图片失败,状态码: {response.status_code}')

# 定义目标网页的URL
url = 'https://mp.weixin.qq.com/s/d7DUHB-hT8DExjpxsEncQw'

# 发送GET请求获取网页内容
response = requests.get(url)

# 检查响应状态码,200表示请求成功
if response.status_code == 200:
    # 输出网页源代码
    print(response.text)

    # 定义包含目标网址的字符串
    source_code = response.text
    # 使用正则表达式提取网址
    # url_pattern = re.compile(r'cdn_url_1_1\s*=\s*"(.*?)"')
    url_pattern = re.compile(r'cdn_url_1_1 = "(.*?)"')
    matches = url_pattern.findall(source_code)
    # 输出提取到的网址
    if matches:
        print(matches[0])
        image_save(matches[0], "images")
    else:
        print("No URL found.")

else:
    # 如果请求失败,打印错误信息
    print('Failed to retrieve webpage:', response.status_code)

最后,可以将其封装为函数,方便调用。

import requests
import re
import os
#TODO 使用时间戳当作文件名称
def get_time():
    import time
    timestamp = int(time.time())
    return timestamp
#TODO 实现从网页图片保存到本地,输入为图片网址和保存路径
def image_save(image_url, path):
    if not os.path.exists(path):         # 如果文件夹不存在,则创建
        os.makedirs(path)

    # 发送 GET 请求获取图片数据
    response = requests.get(image_url)
    # 确保请求成功
    if response.status_code == 200:
        image_name = get_time()
        image_name = "{}.jpg".format(image_name)
        # 指定图片保存路径
        save_path = os.path.join(path, image_name)  # 这里将图片保存在名为 images 的文件夹中
        # 将图片数据写入文件
        with open(save_path, 'wb') as f:
            f.write(response.content)
        print(f'图片已保存为: {save_path}')
    else:
        print(f'下载图片失败,状态码: {response.status_code}')

# 定义目标网页的URL
url = 'https://mp.weixin.qq.com/s/d7DUHB-hT8DExjpxsEncQw'
# TODO 微信公众号获取封面并保存,输入网址
def get_image(wechat_url):
    response = requests.get(wechat_url)

    # 检查响应状态码,200表示请求成功
    if response.status_code == 200:
        # 定义包含目标网址的字符串
        source_code = response.text
        # 使用正则表达式提取网址
        url_pattern = re.compile(r'cdn_url_1_1 = "(.*?)"')
        matches = url_pattern.findall(source_code)
        # 输出提取到的网址
        if matches:
            print(matches[0])
            image_save(matches[0], "images")
        else:
            print("No URL found.")

    else:
        # 如果请求失败,打印错误信息
        print('Failed to retrieve webpage:', response.status_code)

get_image(url)

最后结果如下:
在这里插入图片描述

  • 69
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
Python可以用于爬取微信公众号的文章。有几种方式可以实现这一目标,其中一种方式是通过登录微信公众号平台,在里面搜索要爬取公众号,然后进行抓包。另外一种方式是使用安卓模拟器进行抓包。还可以使用搜狗的微信模块来获取数据。 在使用第一种方式时,首先需要拥有一个微信公众号的账。然后,通过工具如pycharm和fiddler等,登录微信公众号平台,进入创作管理,选择文素材,然后创建或编辑文章。最后,通过添加引用和查找公众号文章等步骤,进行数据的爬取和收集。 在实现这些步骤之前,你需要了解微信公众号平台的主要功能和界面布局。主面板可以划分为七大块,每个块都有不同的功能。在后续的操作中,你可以使用Python代码来模拟微信请求,并实现数据的爬取和分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [欢度国庆⭐️共享爬虫之美⭐️基于 Python 实现微信公众号爬虫(Python无所不能爬)](https://blog.csdn.net/xiejiachao/article/details/120573509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【爬虫】python爬取微信公众号](https://blog.csdn.net/qq_36269293/article/details/109244944)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

knighthood2001

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值