Python 爬取周杰伦instagram
整体框架
使用国内能访问的某国外 app angine 爬取Jay的 Instagram 并显示,再使用国内的 sae 访问这个网站,再爬取一次并发送到微博小号。
bs4
使用requests爬取 Instagram 时候,并没有加request header
,Instagram 对 robot 还算友好,直接返回不带 js 的网页信息。通过bs4迅速定位到照片、视频信息,再用正则表达式提取到链接并下载、显示。,正则表达式让人头痛,使用str.split(\' \')
来使字符串变成列表。
from bs4 import BeautifulSoup
filepath = \'C:\Users\hndx\Desktop\ins.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 \u8b1d\u8b1d\u91d1\u83ef\u7684\u670b\u53cb\u5011 high\u7684\u4e0d\u8981\u4e0d\u8981\u7684 #\u91d1\u83ef #\u96d9\u7bc0\u68cd#\u96d9\u622a\u68cd\'}}]
"""
保存图片
参考 :如何用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
变量)