百度手搜广告采集
优采云 发布时间: 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的广告是怎样抓取的!
喜欢就点赞吧!