运行平台: Windows
Python版本: Python3.x
IDE: PyCharm
一、前言
现在接到一个抓取各大新闻和视频平台的广告数据,刚开始是完全懵逼的,自己又不懂python,我可是做Android sdk开发的,这不是在为难我吗?但是老大已经下了需求,我只能完成。经过一个星期的学习,大致了解python的语法,下面来说说我抓取各个平台广告数据的过程。
二、软件使用说明
想要抓取平台数据,就需要先获取平台接口,下面以爱奇艺视频网站为例来给大家讲解。
1、软件下载
抓取数据大家都很熟悉fiddler,这里要跟大家说个一个坑,我最开始的时候使用fiddler抓取数据,但是现在大多都是https请求,我也使用fiddler安装证书,还是抓不到接口,果断换了抓包工具Charles,具体怎么使用大家可以百度,这里不是重点。
这里直接给大家爱奇艺ios平台app接口:
url=https://cards.iqiyi.com/views_home/3.0/qy_home?app_v=9.2.0&gps=113.33039,23.12890&app_lm=cn&lang=zh_CN&psp_status=1&profile=%257B%2522group%2522%253A%25221%252C2%2522%252C%2522counter%2522%253A1%257D&app_k=8e48946f144759d86a50075555fd5862&dev_os=10.2&ouid=424c533745ef0486b8258da000fa6a379a2e34eb&secure_v=1&net_sts=1&api_v=6.7&dev_ua=iPhone8,1&layout_name=base_layout&core=1&from_rseat=0&card_v=3.0&province_id=3001&from_rpage=home_top_menu&platform_id=12&rcstp=4&qyid=8525F065-F88D-417A-9042-09D046D33C8D&from_block=E:020000&page_st=&secure_p=iPhone&cupid_v=3.19.001&layout_v=22.56&scrn_scale=2&req_sn=1524216129958&cupid_uid=8525F065-F88D-417A-9042-09D046D33C8D&idfa=8525F065-F88D-417A-9042-09D046D33C8D&req_times=1
接下来就可以开始撸代码了,我这里使用的是requests库:
response =requests.get(url)
好了,我们可以开开心心的运行了,结果报错了
原因是因为这里是https请求,我们需要跳过验证,我们来修改一下代码:
response = requests.get(url, verify=False)
再次运行看结果:数据为空。这是什么原因呢?抓到的接口是有数据的,运行为什么就没有数据了。我打开抓包工具,抓到python运行的请求,对比有数据的请求,发现爱奇艺是需要设置请求头的,那我只能跟着做了,再次修改代码:
header = {"Host": "cards.iqiyi.com", "Accept-Language": "zh-cn", "Connection": "keep-alive", "Accept-Encoding": "gzip", "NetType": "wifi", "t": str(t), "sign": sign, "User-Agent": "QIYIVideo/9.2.0 (iOS;com.qiyi.iphone;iOS10.2;iPhone8,1) Corejar", "Accept": "*/*"}
response = requests.get(url, headers=header, verify=False)
这次终于拿到了自己想要的数据,我使用Hijson工具查看json数据,数据结构如下:
因为我需要的是游戏广告素材,我这里就以游戏广告为例了。看到这个数据结构,解析数据就没什么难度了。解析数据代码如下:
try: statistics = (json.loads(jsonStr))["base"]["statistics"] if "ad_str" in statistics: json_list = (json.loads(statistics["ad_str"]))["adSlots"][0]["ads"] for json_str in json_list: if len(json_str["clickTracking"]["thirdPartyTracking"]) > 1: self.savaDataInfo(json_str) except KeyError as x: print(x)
解析到自己想要的数据,然后就是将数据入库了,我这里使用mongodb数据库:
def __init__(self): conn = MongoClient('127.0.0.1', 27017) db = conn.test # 连接mydb数据库,没有则自动创建 self.my_set = db.test def save_db(self, feed): self.my_set.insert(feed)
def savaDataInfo(self, data): DataInfo.title = data["adtitle"] DataInfo.type = "图片" DataInfo.channel = "爱奇艺" DataInfo.appdownload = data["link"] DataInfo.pic_list = data["srcid"] DataInfo.device_type = "ios" DataInfo.genre = "游戏" SaveJsonUtil().saveDataToDB()
def saveDataToDB(self): json_obj = {} json_obj["_id"] = int(time.time() * 1000000) json_obj["title"] = DataInfo.title json_obj["appdownload"] = DataInfo.appdownload json_obj["res_time"] = int(time.time()) json_obj["channel"] = DataInfo.channel json_obj["genre"] = DataInfo.genre json_obj["content"] = DataInfo.content json_obj["gif"] = DataInfo.gif json_obj["video"] = DataInfo.video json_obj["type"] = DataInfo.type json_obj["pic_list"] = DataInfo.pic_list json_obj["device_type"] = DataInfo.device_type json_obj["material_size"] = DataInfo.material_size json_obj["app_name"] = DataInfo.app_name print("json_obj=" + str(json_obj)) MongoManager().save_db(json_obj)
我这里只是举例爱奇艺首页的数据,还有分页的数据,这里就不说了,参照同样的方法即可。已经完成了一个平台的数据抓取,其他的平台都是类似的做法,很快就完成了。