zoukankan      html  css  js  c++  java
  • Python 爬取周杰伦instagram

    整体框架

    使用国内能访问的某国外 app angine 爬取Jay的 Instagram 并显示,再使用国内的 sae 访问这个网站,再爬取一次并发送到微博小号。

    bs4

    使用requests爬取 Instagram 时候,并没有加request header,Instagram 对 robot 还算友好,直接返回不带 js 的网页信息。通过bs4迅速定位到照片、视频信息,再用正则表达式提取到链接并下载、显示。,正则表达式让人头痛,使用str.split(' ')来使字符串变成列表。

    from bs4 import  BeautifulSoup
    
    filepath = 'C:UsershndxDesktopins.html'
    soup = BeautifulSoup(open(filepath),'lxml')
    
    script = soup.select('script')
    
    print str(script[2]).split('},{"node":')[1]
    

    通过分析ins.html,得到每个node就是一个动态。这样str(script[2]).split('},{"node":')[1]就是带有Jay最新动态信息的 Unicode 字符了。应用json 直接将这个信息转化成字典dict,如下

    import json
    i = json.loads(info)
    print i["edge_media_to_caption"]['edges']
    """
    [{u'node': {u'text': u'Just finished now u8b1du8b1du91d1u83efu7684u670bu53cbu5011 highu7684u4e0du8981u4e0du8981u7684 #u91d1u83ef #u96d9u7bc0u68cd#u96d9u622au68cd'}}]
    """
    

    保存图片

    参考 :如何用requests优雅的下载图片? ,这个应该是最简洁的答案了。

    import requests
    s = requests.session()
    ss = s.get('https://www.baidu.com/img/bd_logo1.png')
    open('logo.png', 'wb').write(ss.content)
    

    数据库 ORM Flask-SQLAlchemy

    学习参考 Flask-SQLAlchemy 官方文档
    有关增删改查的操作 flask SQLAlchemy 数据库操作
    数据库对象

    class photo(db.Model):
        __tablename__ = "photoid"
    
        id = db.Column(db.Integer)  #参数  primary_key=True 表示此键值不能重复,必须有一个primary_key=True。
        url = db.Column(db.String(4096),primary_key=True )
        text = db.Column(db.String(4096))
    
        def __init__(self, id, url,text):
            self.id = id
            self.url = url
            self.text = text #这里有三个行
    

    关于创建、查找

    
    In [1]: import flask_app
    
    In [2]: con = ['1','2']
    
    In [3]: flask_app.photo(con[0],con[1])
    Out[3]: <flask_app.photo at 0x7fa109b5ccd0>
    
    In [4]: flask_app.db.session.add(flask_app.photo(con[0],con[1]))
    
    In [5]: flask_app.db.session.commit()
    
    In [6]: flask_app.photo.query.filter_by(id='1').first()
    Out[6]: <flask_app.photo at 0x7fa11179e890>
    
    In [7]: p1 =flask_app.photo.query.filter_by(id='1').first()
    
    In [8]: p1.id
    Out[8]: 1
    
    In [9]: p1.url
    Out[9]: u'2'
    

    Mysql 用到的语句

    DROP TABLE table_name ;

    删除数据表

    insta.py

    # -*- coding: utf-8 -*-
    """
    insta 爬虫
    Created on Fri May 04 09:02:26 2018
    
    @author: aubucuo
    """
    import requests
    from json import loads
    from bs4 import  BeautifulSoup
    import re
    
    s = requests.session()
    u = 'https://www.instagram.com/jaychou/'
    
    def ins(pid):
        rt = []
        c1 = s.get(u)
        soup = BeautifulSoup(c1.content,'lxml')
        script = soup.select('script')
    
        ls = script[2].contents
        ls1 = re.findall('window._sharedData = (.+?);', str(ls[0]))
        js = loads(ls1[0])['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges']
        j_id = js[0]['node']['id']
        is_video =js[0]['node']['is_video']
        j_url = js[0]['node']['display_url']
        j_text = js[0]['node']['edge_media_to_caption']['edges'][0]['node']['text']
    
    
        if j_id!= pid and not is_video: #如果id 不重复 且不是video
            rt.append(True)
            rt.append(j_id)
            rt.append(j_url)
            rt.append(j_text)
    
            c2 = s.get(j_url)
            open('mysite/static/jay.jpg', 'wb').write(c2.content)
            return rt
        else :
            rt.append(False)
            return rt
    
    

    其中pid上次执行时候最新一张图片的id,用来判断是否有更新。其实这里bs4对我的帮助并不大。上面程序只做到了保存最新的一张图片(jay.jpg),实测中,总是保存第二张图片,可能是正则表达式的问题。不影响功能,不再深究了。
    使用 json 精准定位N次,(注意到js变量)

    发微博参见微博API 学习记录

  • 相关阅读:
    Java正则表达式的使用
    萤火虫小巷2(看完了)
    第七章--Java基础类库--与用户的互动
    Android界面编程--使用活动条(ActionBar)--通过ActionBar菜单改变TextView的字体和颜色
    电影:换肤(Replace)
    Android界面编程--使用活动条(ActionBar)
    萤火虫小巷1
    大三下半学期(3月4日定下的学习计划)
    12月17日问题
    JQuery 分页显示jquery-pager-1.0.js
  • 原文地址:https://www.cnblogs.com/aubucuo/p/Jay.html
Copyright © 2011-2022 走看看