巨量新图数据目前只获取了前端显示的数据,up主的详细信息有个前端加密,发起的请求需要sign对应才能拿到数据,而且星图的数据拿取到200条的时候就会监测出来,目前没有解决,有人找到星图的sign可以探讨一下
1.首先想最简单的就是使用selenium模拟然后解析获取数据,但是网站直接监测到seleniun,百度过一些方法,如何跳过selenium监测,目前都没有实现,代码如下所示
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_experimental_option('useAutomationExtension', False)
# 设置不加载图片
# option.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
driver = Chrome(options=option)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
最后还是老老实实的使用request模块,代码比较简单,直接手动复制cookie,跳过登录,麻烦的就是去找js请求,还是使用chrome的network来进行抓包,目前的请求地址如下所示
https://www.xingtu.cn/v/api/demand/author_list/?limit=20&need_detail=true&page=1&platform_source=1&order_by=score&disable_replace_keyword=false&marketing_target=1&task_category=1&tag=1&is_filter=true
更具筛选条件的不一样,url也会增加对应的查询条件,多拿几次请求就好了。如何根据自己塞选的条件构建请求地址即可,我这里有一个配置文件,目前适配的也只有如下几个大类
配置文件
营销目标:品牌传播
内容类型:美食
内容类别小类是第几个:2
粉丝数量区间:
报价区间:
所在地域:
预期cpm:1-30
预期播放量:
解析配置文件
# 解析配置文件
def par_init():
with open('init.txt', 'r') as fp:
for i in fp:
init_list.append(i.split(':')[-1].replace('\n', ''))
# 链接分类的标签
init_dict = {'颜值达人':72, '美食':48, '搞笑剧情':97, '生活':36}
# 营销目标分类
mark_dict = {'品牌传播':1, '电商带货':2}
def creat_url():
item_multiplication = 10000
if len(init_list[3]) != 0:
min_fans = int(init_list[3].split('-')[0])
max_fans = int(init_list[3].split('-')[1])
if len(init_list[4]) != 0:
min_price = int(init_list[4].split('-')[0])
max_price = int(init_list[4].split('-')[1])
if len(init_list[6]) != 0:
min_expected_cpm = int(init_list[6].split('-')[0])
max_expected_cpm = int(init_list[6].split('-')[1])
if len(init_list[7]) != 0:
max_expected_play = int(init_list[7].split('-')[0])
min_expected_play = int(init_list[7].split('-')[1])
base_url = 'https://www.xingtu.cn/v/api/demand/author_list/?limit=20&need_detail=true&page=1&' \
'platform_source=1&order_by=score&disable_replace_keyword=false'
# 市场还是品牌
mark_target_url = '&marketing_target={}&task_category=1'
# 大类
target_url = '&tag={}'
# 小类
two_target_url = '&tag_level_two={}'
fans_url = '&fans_min={}&fans_max={}'
price_url = '&price_max={}&price_min={}'
cpm_url = '&expected_cpm__ge={max}&expected_cpm__le={min}'
play_url = '&expected_play_num__le={}&expected_play_num__ge={}'
url_end = '&is_filter=true'
base_url = base_url + mark_target_url.format(mark_dict[init_list[0]])
base_url = base_url + target_url.format(init_dict[init_list[1]])
if len(init_list[2]) != 0:
# print(init_dict[init_list[1]] + int(init_list[2]))
base_url = base_url + two_target_url.format(init_dict[init_list[1]] + int(init_list[2]))
if len(init_list[3]) != 0:
base_url = base_url + fans_url.format(min_fans * item_multiplication, max_fans * item_multiplication)
if len(init_list[4]) != 0:
base_url = base_url + price_url.format(max_price , min_price)
if len(init_list[6]) != 0:
# print(max_expected_cpm,min_expected_cpm)
base_url = base_url + cpm_url.format(max = min_expected_cpm, min=max_expected_cpm)
if len(init_list[7]) != 0:
base_url = base_url + play_url.format(max_expected_play*item_multiplication, min_expected_play*item_multiplication)
base_url+=url_end
return base_url
链接构建完成先去获取一次总的数据,cookie用自己的就好了
# 获取总共的条数
def get_total_info():
url = creat_url()
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/92.0.4515.131 Safari/537.36'}
cookies = {'cookies':''}
resopnse = requests.get(url=url, headers=headers, cookies=cookies)
item = json.loads(resopnse.text)
total = int(item['data']['pagination']['total_count'])
print(total)
return total
然后遍历总数来修改url中的page信息,重新发起请求,修改page信息,发起请求,解析数据即可
url = re.sub(r'page=\d', 'page='+ str(index), url)
后期解决了sign会同步上来,不过这个的sign有点麻烦