python 获取巨量星图数据

本文介绍了在遇到前端加密和请求sign限制时,尝试使用selenium进行数据抓取遇到的问题及解决方案。作者分享了如何通过手动复制cookie并构建请求URL来绕过登录,以及如何根据筛选条件构造请求地址。尽管目前尚未解决sign问题,但已能获取部分数据。文章还展示了如何遍历请求以获取更多数据。
摘要由CSDN通过智能技术生成

巨量新图数据目前只获取了前端显示的数据,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有点麻烦

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值