Python3网络爬虫:爱奇艺视频App的广告数据抓取

时间:2024-04-07 14:37:22

运行平台: 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)

好了,我们可以开开心心的运行了,结果报错了

Python3网络爬虫:爱奇艺视频App的广告数据抓取

原因是因为这里是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数据,数据结构如下:

Python3网络爬虫:爱奇艺视频App的广告数据抓取

因为我需要的是游戏广告素材,我这里就以游戏广告为例了。看到这个数据结构,解析数据就没什么难度了。解析数据代码如下:

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)

我这里只是举例爱奇艺首页的数据,还有分页的数据,这里就不说了,参照同样的方法即可。已经完成了一个平台的数据抓取,其他的平台都是类似的做法,很快就完成了。