百度手搜广告采集

优采云 发布时间: 2020-08-23 03:02

  百度手搜广告采集

  最近接到一些活儿,是通过关键字采集百度搜索页第一页的游戏广告,所须要采集的数组如下:

  关键词:我们制定的词

排名:在百度搜索结果页中的排名位置

广告标题:百度搜索结果页中的广告标题

广告语:广告div里面的文本内容

广告落地页链接:点击广告跳转的落地页URL

落地页标题:落地页HTML的Title

APK链接:APK下载地址,如果a或button里面的地址获取不到,就为空;如果能直接匹配到href之类的,就填这个href的地址

应用名、包名、版本号:

  由于须要模拟点击下载按键下载apk文件,于是就可以上爬虫神器:selenuim + Firefox。熟悉爬虫的同事应当都晓得,这个平常尽量不用,虽然准确率高,但是效率太慢,尽量查找是否可以取代的api接口,源码当中有其实最好了,直接一把梭!好了不扯这么多了,下面开始讲重点!

  一、采集思路步入/ 网站,通过关键字【传奇】查找结果页打开浏览器开发者工具,找寻列表页html标签规律查询到结果页收录百度【广告】的游戏获取对应标题、在所有结果页中的排行,广告描述步入广告落地页,获取落地页地址,以及下载相关apk包通过aapt来获取游戏apk信息

  示例:

  

  二、划重点

  1、广告落地页如何获取

  大家获取以为这个很简单,直接通过requests.get(url)就可以达到呀,其实不然,不信你可以试一试,发现如何恳求都还是结果页的那种地址,并不是我们想要的广告地址,这个时侯就须要selenium出场:

  from selenium import webdriver

browser = webdriver.Firefox()

browser.get(url)

ad_url=browser.current_url

  ad_url就是我们所须要的最终的广告也url了,这里你们是不是认为太神奇!嘿嘿。。。(猥琐)

  2、广告apk信息如何获取

  大家可能极少接触这个,于是微软一顿操作猛如虎,出来这么个东东:aapt,大家首先下载对应版本 aapt,需要添加到环境变量,通过如下命令可

  以获取apk包的信息:

  aapt dump badging xxxx.apk

  

  OK上代码:

  # -*- coding: utf-8 -*-

import re

import subprocess

import os

class ApkInfo:

def __init__(self, apk_path):

"""

通过apk包获取apk信息

:param apk_path:apk路径

"""

self.apkPath = apk_path

# self.aapt_path = self.get_aapt()

def get_apk_size(self):

"""

得到apk的文件大小

:return:

"""

size = round(os.path.getsize(self.apkPath) / (1024 * 1000), 2)

return str(size) + "M"

def get_apk_base_info(self):

"""

获取apk包的基本信息

:return:

"""

apk_name=""

p = subprocess.Popen("D:\APK\\build-tools_r28.0.2-windows\\android-9\\aapt dump badging %s" % self.apkPath, stdout=subprocess.PIPE,

stderr=subprocess.PIPE,

stdin=subprocess.PIPE, shell=True)

(output, err) = p.communicate()

base_info_match = re.compile("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'",re.I).match(output.decode())

apk_name_match = re.compile("application-label:'([\u4e00-\u9fa5_a-zA-Z0-9-\S]+)'|application-label-zh_CN:'([^']+)'|application: label='(.+)' icon='(.*)'|application-label:'([^']+)'.+|launchable-activity.+label='([^']+)'.+", re.I).search(output.decode())

if apk_name_match is not None:

apk_name= apk_name_match.group(1)

else:

raise Exception("can't get application-label, info={}".format(output.decode()))

if not base_info_match:

raise Exception("can't get packageinfo")

package_name = base_info_match.group(1) #包名

version_name = base_info_match.group(3) #版本名

return package_name,apk_name, version_name

if __name__ == '__main__':

apk_info = ApkInfo("123.apk")

print("apk包名:",apk_info.get_apk_base_info()[0])

print("apk应用名:",apk_info.get_apk_base_info()[1])

print("apk版本名:",apk_info.get_apk_base_info()[-1])

print("apk大小:",apk_info.get_apk_size())

  那么你们会想,如何实现自动化来操作呢,比如步入到广告落地页,如何通过程序下载完整的apk?下载完后通过aapt命令来获取广告包信息?

  本项目推行是通过傲游的无头浏览器来模拟点击步入到广告落地页,通过点击广告的button下载地址来获取apk,同时还要指定广告下载目录,这种种操作都是模拟人的行为

  关键配置:

  profile = webdriver.FirefoxProfile()

options = webdriver.FirefoxOptions()

options.add_argument('-headless') #使用火狐无头浏览器

profile.set_preference('browser.download.dir', self.down_path+"\\"+getMd5(self.url)) # 指定下载路径

profile.set_preference('browser.download.folderList', 2) # 设置成 2 表示使用自定义下载路径;设置成 0 表示下载到桌面;设置成 1 表示下载到默认路径

profile.set_preference("javascript.enabled", False)

profile.set_preference('browser.download.manager.showWhenStarting', False) # 在开始下载时是否显示下载管理器

profile.set_preference('browser.helperApps.neverAsk.saveToDisk','application/vnd.android.package-archive') # 下载文件类型

browser = webdriver.Firefox(firefox_profile=self.profile,options=self.options)

  OK,这个无头浏览器咋们就封装好啦。

  三、总结

  本项目的难点我直接如下:

  记得加上代理,不然频次快了会被ban的,还有一点须要注意,由于采集的是m站,项目中的UA也必须对应手机的UA,血的教训,之前是随机模拟的傲游的UA,后来发觉采集的广告极少,几乎木有。替换为手机的UA后基本上一个关键字可以查询到1-3个广告。

  大家先结合本文根据自己的思路搞一遍,后面遇见哪些难点可以直接私信我,免费为你们答疑解惑!

  采集结果:

  

  上面有的apk信息为空是由于没有通过selenium获取到下载,因为每一个广告button位置不一样,且在源码当中都不一定可以找到,所有有的就留空即可。总的来说顾客还比较满意,后面我将为你们讲讲头条app的广告是怎样抓取的!

  喜欢就点赞吧!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线