前言

我们经常能够在微信公众号上看到各种的文章,而如果我们需要保存到自己本地,难道还需要一个个去复制粘贴吗,答案,根本不需要,只需要一个小小的调用接口,即可将文章悉数拿到,也算一个小爬虫吧

获取assetoken

我们通过微信的开发者平台,可以看到,我们只需要调用一个接口,即可获取assettoken

def access_token():
    appid = 'APPID'
    secret = 'SECRET'
    url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s'%(appid,secret)
    res = requests.get(url=url)
    res = json.loads(res.text)
    return res['access_token']

appid和secret就不用细说了,获取这个是很简单的一件事,不仅仅是获取这个文章,调用任何微信公众号的接口,都需要先获取了这个asset_token

获取素材

获取素材就非常的让我暴躁了,因为他的编码格式问题,让我头疼了好久,我们先来看一下这个官方的文档,

需要三个参数,type,offset,count,我们要获取的是图文,所以,type使用news,offset和count就是从哪一个开始返回和返回的个数,不过需要注意的是,返回的个数最大值是20

token = access_token()
    url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s'%(token)
    data = {
    "type":'news',
    "offset":1,
    "count":1
    }
    data = json.dumps(data)
    res = requests.post(url=url,data=data)
    r = res.text.encode('ISO-8859-1').decode('utf8')
    r = json.loads(r)

这里,我们接入他的接口,但是返回的是ISO-8859-1编码,所以我们需要进行解码

如何查看返回的编码,有一个小技巧,就是打印一下res.encoding 即可

由于这个编码的特殊性,我们需要先对其进行编码,在进行解码

我们再根据他的数据格式,存入到我们的数据库

完善代码

def obtain_article():

    token = access_token()
    url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s'%(token)
    data = {
    "type":'news',
    "offset":1,
    "count":1
    }
    data = json.dumps(data)
    res = requests.post(url=url,data=data)
    r = res.text.encode('ISO-8859-1').decode('utf8')
    r = json.loads(r)
    conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='mySQL',database='blue_lake_user',charset='utf8')
    cursor = conn.cursor()
    for i in range(len(r['item'])):
        title = r['item'][i]['content']['news_item'][0]['title']
        link = r['item'][i]['content']['news_item'][0]['url']
        img_url = r['item'][i]['content']['news_item'][0]['thumb_url']
        create_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
        sql = "insert into article(title,img,link,create_time,status) values(%s,%s,%s,%s,'1')" % (conn.escape(title),conn.escape(img_url),conn.escape(link),conn.escape(create_time),)
        cursor.execute(sql)
        conn.commit()
        conn.close()

由于之前说过,数据过长的话,会导致错误,所以,我们采用了escape来进行处理

一个编码整半天,哎,心累