Python2.7下载微信公众号文章的图片

由于微信公众号反爬虫升级,本文代码已经不可用,请移步至:Python2.7下载微信公众号文章的图片(二)

由于微信公众号文章里的图片是存在<img>标签的data-src属性里的,所以网上的代码大多数不能用,还有一个封面图片是存在javascript变量里的,最后经过思考用正则表达式解析出来

Python2.7代码如下

# -*- coding: UTF-8 -*-
import os
import shutil
import httplib2
from bs4 import BeautifulSoup
import re
import binascii

h = httplib2.Http()
url = 'http://mp.weixin.qq.com/s?__biz=MjM5MDk0OTEyNg==&mid=213324685&idx=1&sn=186ee1433c04b23f6f123566e33e0b79&3rd=MzA3MDU4NTYzMw==&scene=6#rd'
resp, content = h.request(url)
print resp

# 正则表达式javascript里的获取相关变量
matchnickname = re.search(r'var\s*nickname\s*=\s*[\'\"](?P<nickname>\S*)[\'\"];', content)
matchappuin = re.search(r'var\s*appuin\s*=\s*[\'\"](?P<appuin>\S*)[\'\"];',content)
matchct = re.search(r'var\s*ct\s*=\s*[\'\"](?P<ct>\S*)[\'\"];', content)
matchuser_name = re.search(r'var\s*user_name\s*=\s*[\'\"](?P<user_name>\S*)[\'\"];', content)
matchmsg_cdn_url = re.search(r'var\s*msg_cdn_url\s*=\s*[\'\"](?P<msg_cdn_url>\S*)[\'\"];', content)

idx =  re.search(r'idx=(?P<idx>[0-9]+)',url).group('idx')
nickname = matchnickname.group('nickname')
appuin = matchappuin.group('appuin')
ct =  matchct.group('ct')
user_name =  matchuser_name.group('user_name')
msg_cdn_url = matchmsg_cdn_url.group('msg_cdn_url')

# 建立文件夹
dir='WeiXinGZH/'+nickname.decode('utf-8').encode('gb2312') + '/' + ct + '/' + idx + '/'
print '文件夹为:'+dir.decode('gb2312').encode('utf-8')
try:
    os.makedirs(dir)  # 建立相应的文件夹
except:
    shutil.rmtree(dir)  # 无论文件夹是否为空都移除该文件夹
    os.makedirs(dir)

# 下载封面
url = msg_cdn_url
print u'正在下载封面:'+url
resp, contentface = h.request(url)
file_name = dir +'封面'.decode('utf-8').encode('gb2312') + '.jpg'
open(file_name, 'wb').write(contentface)

# 下载其他图片
soup = BeautifulSoup(content, 'html.parser')
count = 0
for link in soup.find_all('img'):
    if None != link.get('data-src'):
        count = count + 1
        orurl = link.get('data-src')
        url = orurl.split('?')[0]  # 重新构造url,原来的url有一部分无法下载
        print u'正在下载:'+url
        resp, content = h.request(url)

        matchurlvalue = re.search(r'wx_fmt=(?P<wx_fmt>[^&]*)', orurl) # 无参数的可能是gif,也有可能是jpg
        if None!= matchurlvalue:
            wx_fmt = matchurlvalue.group('wx_fmt') # 优先通过wx_fmt参数的值判断文件类型
        else:
            wx_fmt = binascii.b2a_hex(content[0:4]) # 读取前4字节转化为16进制字符串
        print wx_fmt
        phototype = {'jpeg': '.jpg', 'gif': '.gif', 'png': '.png', 'jpg': '.jpg', '47494638': '.gif', 'ffd8ffe0': '.jpg', 'ffd8ffe1': '.jpg', '89504e47': '.png'}  # 方便写文件格式
        file_name = dir + 'Picture' + str(count) + phototype[wx_fmt]
        open(file_name, 'wb').write(content)

print '图片下载完成'



后记20150902:

1.修复部分文件无法下载以及格式错误

2.修复无wx_fmt参数时文件格式识别错误

3.不知道为什么,有一篇公众号文章的图片解析不出来,改用正则改了半天不用特殊字符也出不来,如果有读者解析出来了记得告诉我一声,网址如下:http://mp.weixin.qq.com/s?__biz=MzA3NDMyNjMxMQ==&mid=200318070&idx=1&sn=83e96181cb58b8d06b6c39e9320d0b83&3rd=MzA3MDU4NTYzMw==&scene=6#rd

4.修复同一组文章下载图片出现覆盖的情况

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值