请问这种网页是不是 js 加密的?应该如何获取数据? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
maloneleo88
V2EX    Python

请问这种网页是不是 js 加密的?应该如何获取数据?

  •  
  •   maloneleo88 2021-02-15 12:38:29 +08:00 5161 次点击
    这是一个创建于 1705 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://zq.win007.com/analysis/1964531cn.htm

    学了几天 python,实战败了,这种动态的 requests 不到,各种错误。

    最后试了 selenium,可以拿到数据,也可以分析,但是太慢了,花费时间和人力没区别。

    作为一枚小白,怎样才能拿到这种实施响应的数据?我觉得这个不是 ajax 请求到的 json 吧?也不是普通的 js 脚本。

    这里是不是还有加密信息?我想得到对赛往绩的数据,应该从哪个地方入手?
    这种页面数据,按网上的方法,搜索不到相关的 js 文件,望大佬不吝赐教。!!!
    39 条回复    2021-02-16 19:28:03 +08:00
    maloneleo88
        1
    maloneleo88  
    OP
       2021-02-15 12:43:38 +08:00
    想得到心理上的满足与快感吗?
    想展现男人的雄风吗?
    想站在众山之巅俯视苍生吗?

    那就快来回答我的问题吧! :)
    matrix67
        2
    matrix67  
       2021-02-15 12:50:44 +08:00
    var sOdds=[['未开场',0,0,0.65,0,1.20,1.11,0.25,0.72,0.89,0.25,0.93,0.94,0.5,0.88,0.70,0.75,1.11,1.06,1,0.74,0.97,2.25,0.83,0.81,2.25,0.99,2.82,1.99,3.80,2.53,2.08,4.10,2.14,3.15,3.00,1.94,3.25,3.35,0,0,0,0,0,0,0],['45',0,0,1.17,0.25,0.71,0.47,0,1.63,0.98,0.5,0.88,0.96,0.25,0.90,1.08,1,0.76,5.26,0.5,0.03,0.81,2.25,0.99,1.12,1.25,0.73,2.66,2.03,3.95,14.00,1.01,17.00,2.00,3.15,3.30,2.35,2.25,4.00,1,0,0,0,0,0,0],['中场',0,0,,,,,,,0.96,0.25,0.90,1.00,0.25,0.86,,,,,,,1.12,1.25,0.73,0.86,1,0.98,,,,,,,2.35,2.25,4.00,2.42,2.13,4.20,2,0,0,0,0,0,0],['85',0,0,,,,,,,1.00,0.25,0.86,0.43,0,1.75,,,,,,,0.86,1,0.98,3.70,0.5,0.11,,,,,,,2.42,2.13,4.20,7.90,1.09,13.00,3,0,0,0,0,0,0]];maketable();
    maloneleo88
        3
    maloneleo88  
    OP
       2021-02-15 13:00:42 +08:00
    @matrix67 这个是 Odds,Odds 是赔率,不是我要的信息。我想要对赛往纪,或者近期战绩里面的信息。 劳烦再看一下,这是 js 加密的吗?
    gongym
        4
    gongym  
       2021-02-15 13:47:54 +08:00
    数据都在页面里呢,下载下来 html,搜索 v_data,Vs_hOdds 就看到了
    maloneleo88
        5
    maloneleo88  
    OP
       2021-02-15 14:45:46 +08:00 via Android
    @gongym 我的好哥哥,先不管数据在不在页面里。我现在是连 requests 页面都不可以啊。 只能总 selenium,毫无意义呀,慢的要死
    darer
        6
    darer  
       2021-02-15 14:52:55 +08:00
    UA cookie refer 一般也就判定这几个吧
    input2output
        7
    input2output  
       2021-02-15 14:57:26 +08:00
    加一下
    User-Agent
    Accept
    darer
        8
    darer  
       2021-02-15 14:58:20 +08:00
    https://sm.ms/image/PRSijLcgFdl95Nq
    试了个 UA 就爬到了
    v2sir
        9
    v2sir  
       2021-02-15 14:58:34 +08:00   2
    作为小白, 应该好好学习。如果连这么简单的页面都提取不了。应该回过头去重新学, 或者学会放弃。
    maloneleo88
        10
    maloneleo88  
    OP
       2021-02-15 15:01:20 +08:00
    @darer
    XHR 里面有两个包
    http://zq.win007.com/analysis/odds/1964531.htm?1613372332000
    http://zq.win007.com/xml/position/footballanaly.txt?r=0071613372333000

    第一个好像不是,只是赔率信息,第二个什么也看不到。
    maloneleo88
        11
    maloneleo88  
    OP
       2021-02-15 15:05:25 +08:00
    @input2output 谢谢,马上去试,真的不懂

    @v2sir 不耻下问,自学好难,而且没几天,是想好好学,可没有正八经的教程,视频教程看看就缺东西了,正经书里也不讲这些。前面一直学 python 基础语法了,然后发现,爬虫跟那个关系根本不大。真是醉了。


    @darer 谢谢哈,我还没太懂,这就去试试,万分感谢!
    maloneleo88
        12
    maloneleo88  
    OP
       2021-02-15 15:25:56 +08:00
    @darer

    import requests
    r = requests.get
    UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68'
    res = r('http://zq.win007.com/analysis/1964531cn.htm',headers={"User-Agent":UA})
    res.encoding = 'utf-8'
    print(res.text)

    我抓下来了,对赛往绩和近期战绩都是空的。直接拿,拿不到的
    maloneleo88
        13
    maloneleo88  
    OP
       2021-02-15 15:30:10 +08:00
    @v2sir 看了你以往评论,一句有用的都没有,是不是现实生活不如意,蹲在网线上泄愤?继续吧~ two be number 1
    sairoa
        14
    sairoa  
       2021-02-15 15:42:43 +08:00
    把数据刷新的请求复制成 curl 格式,然后用 https://curl.trillworks.com/转成 python 的代码,最后就按照自己需求改请求数据喽。看了一下这网站,不让右键,不过数据还是能抓下来的。
    v2sir
        15
    v2sir  
       2021-02-15 15:46:44 +08:00   5
    @maloneleo88 笑了,是谁没得到答案开始泄愤的? 我叫你回头看看补充基本知识就成泄愤了? 你是婴儿还是残疾?一点小问题就像别人欠你似的? 你以为你谁啊? 我非要告诉你答案?
    tan9p
        16
    tan9p  
       2021-02-15 15:48:40 +08:00 via Android
    哈哈,仿佛看到了多年前的自己,祝好运
    gongym
        17
    gongym  
       2021-02-15 15:49:24 +08:00
    @maloneleo88 下载下来 html,搜索 v_data,Vs_hOdds 就看到数据了,具体逻辑是在 func.js 里面的 init 和 init_vs 方法,如果 div 的 id 是 v,就获取 v_data 赋值给 data,渲染 table (除了数据)。然后在 init_vs 方法中执行 showOdds_h 方法和 showOdds_s 方法,加载数据。看了下方法就是获取 Vs_hOdds 和 Vs_eOdds 加载数据。你要的数据。直接从 html 中搜就有了。就在 script 标签中。是加载页面的时候就有的。但是如果不执行 js 方法这个数据是不会渲染到页面上的。
    maloneleo88
        18
    maloneleo88  
    OP
       2021-02-15 16:02:15 +08:00
    @gongym
    @tan9p
    @sairoa
    @darer

    谢谢大家里,数据是不直接显示的,刚刚我找到了。
    v_data 是对赛 h_data 是主队近期战绩 等等等 , 接下来只要解析了。谢谢大家! 万分感谢!!!

    万万分感谢。还是马虎了。粗心真不适合研究这东西,还是比较适合搬砖。



    @v2sir 开始没生气啊,看你回复就上火了,每帖带着一股酸味,你自己看看吧,懒得搭理你。
    musi
        19
    musi  
       2021-02-15 16:04:38 +08:00
    首先,requests 是用来发请求的,所以不知道你说的“动态”是个啥意思。
    其次,selenium 可以拿到,这里要分析两个方面,是请求的不对还是解析数据不对
    再者,看评论,你现在已经请求成功了,但还是没拿到数据,这就是数据解析的问题了,看了一下是写在 js 里,可以尝试用正则或者其他方法提取出来转成 json
    最后,有时候实战不是你学了这单个方面的知识就可以爬的,就拿爬虫来讲,有些网站做了反扒就不是你单学个基础 python 就能爬得出来的,刚学习还是找个简单点的,增强自己的信心
    maloneleo88
        20
    maloneleo88  
    OP
       2021-02-15 16:06:02 +08:00
    @gongym 大哥解释的很透彻,看代码头疼直接保存成 html 了,一看啥也没有,就想是不是又用 js 之类的。后来挨个看代码找到了。感觉看到曙光了,祝各位热心肠新年快乐!
    maloneleo88
        21
    maloneleo88  
    OP
       2021-02-15 16:14:01 +08:00
    @musi 这些概念都是很模糊。十几年前也做过网页玩,不可同日而语。难,岁数大了脑袋也不好用了。从头学是不可能从头学了,学会了就该 40 了。主要目标是干点什么,马上能用的起来就行。有些实在爬不了的只能用 selenium 了,毕竟简单,就是太慢。

    我再去埋汰钻研几小时。早来问的话就不需要花 2 天学 selenium 了。 贴段昨天写的,很乱,有点像狗啃的。

    import requests
    import re
    from selenium import webdriver
    from lxml import etree
    from time import sleep
    #无头浏览模式
    from selenium.webdriver.firefox.options import Options
    optiOns= Options()
    options.add_argument('--headless')

    #定义解析详情页函数
    def analysis():
    bro = webdriver.Firefox(optiOns=options)
    #定义要访问的目标
    analysislink = vlink
    #打开浏览器访问
    bro.get(analysislink)

    #获取源码数据
    page_text = bro.page_source

    #解析数据。实例化 etree
    tree = etree.HTML(page_text)
    #获取主队名称,链接,本次得分
    homeName = tree.xpath('//div[@class="analyhead"]/div[@class="home"]/a/text()')[0]
    homeLink = tree.xpath('//div[@class="analyhead"]/div[@class="home"]/a/@href')[0]
    homeScore = tree.xpath('//div[@class="end"]/div[1]/text()')[0]
    #获取客队名称,链接,本次得分
    guestName = tree.xpath('//div[@class="analyhead"]/div[@class="guest"]/a/text()')[0]
    guestLink = tree.xpath('//div[@class="analyhead"]/div[@class="guest"]/a/@href')[0]
    guestScore = tree.xpath('//div[@class="end"]/div[3]/text()')[0]
    # print(homeName,guestName,homeLink,guestLink,homeScore,guestScore)

    #获取上一次比赛主队的 ID 链接,客队的 ID 链接,双方比分,截取上次主队得分,截取上次客队得分。
    try:
    last_homeLink = tree.xpath('//div[@id="v"]//tr[3]/td[3]/a/@href')[0]
    last_guestLink = tree.xpath('//div[@id="v"]//tr[3]/td[6]/a/@href')[0]
    lastScore = tree.xpath('//div[@id="v"]//tr[3]/td[4]/a/font/text()')[0]
    last_homeScore = lastScore[0]
    last_guestScore = lastScore[-1]

    #a1 本次主队链接+本次主队得分。a2 本次客队链接+本次客队得分,b1 上次主队链接+得分,b2 上次客队链接+得分
    a1 = homeLink + homeScore
    a2 = guestLink + guestScore
    b1 = last_homeLink + last_homeScore
    b2 = last_guestLink + last_guestScore
    #如果本次主队链接+得分等于上次主队链接+得分或者等于上次客队链接+得分
    #然后看本次客队链接+得分是否等于上次主队链接+得分或客队链接+得分
    #如果符合这两个条件,续写入 saiguo.html 相关信息(这里还没有给链接添加超链)
    if a1 == b1 or a1 ==b2:
    if a2 == b1 or a2 == b2:
    print(homeName + ' ' + lastScore + ' ' + guestName + '\n')
    print(analysislink + '\n')
    with open('./saiguo.html','a') as fp:
    fp.write(homeName + ' ' + lastScore + ' ' + guestName + '\n')
    fp.write(analysislink + '\n')
    sleep(2)
    bro.close()
    else:
    bro.quit()
    else:
    bro.quit()
    #如果没有找到上一次的对往战绩则睡眠 1 秒然后退出浏览器
    except:
    bro.close()





    if __name__ == "__main__":
    #浏览器伪装
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68'
    }
    kw = input('输入赛程年月日采集数据:')
    #response 函数为第一次抓取的完赛列表
    respOnse= requests.get('http://bf.win007.com/football/Over_' + kw + '.htm',headers = headers)
    #列表编码为 ,所以需要转一下为 GBK,负责无法正常显示
    response.encoding = 'GBK'
    #转换的文字信息存入 page 变量
    page = response.text

    #提取比赛分析数字,定义正则表达,第二行找到所有
    pattern = r'analysis\(([\s\S]*?)\)'
    numbers = re.findall(pattern,page,re.S)
    for vlink in numbers:
    #拼接处完整 URL
    vlink = 'http://zq.win007.com/analysis/' + vlink + 'cn.htm'
    analysis()
    print('采集完成!')
    v2sir
        22
    v2sir  
       2021-02-15 16:15:32 +08:00   6
    @maloneleo88 你也知道懒得搭理人? 你 requests 开始连 UA 都不加, 你叫我怎么想? 我第一个反应就是你是不是在消遣人。
    musi
        23
    musi  
       2021-02-15 16:16:24 +08:00
    @maloneleo88 selenium 如果你电脑内存大的话可以开多进程,也就是多个浏览器实例,我之前用 selenium hub 一次开了二十多个,稍微快了一点,重要的是这种方法可以安装浏览器插件对网页进行操作
    blodside
        24
    blodside  
       2021-02-15 18:24:08 +08:00   1
    @v2sir 大家都是从不会开始的,大过年的老哥别那么大火气了
    codists
        25
    codists  
       2021-02-15 18:39:21 +08:00
    ```python
    from selenium import webdriver

    url = 'http://zq.win007.com/analysis/1964531cn.htm'
    browser = webdriver.Chrome()
    browser.get(url)
    try:
    tbody = browser.find_elements_by_css_selector('#table_v tr')
    for td in tbody[2:]:
    print(td.text.split(' '))
    except:
    print('NoSuchElement')

    ```
    输出示例:
    ```python
    ['墨西乙', '20-09-14', '塞拉亚', '3-0(1-0)', '3-3', '亚特兰特 1', '1.03', '半球', '0.79', '1.95', '3.17', '3.70', '负', '输', '大']
    ['墨西乙', '20-01-26', '塞拉亚', '1-0(1-0)', '4-5', '亚特兰特', '1.08', '平 /半', '0.76', '2.45', '2.68', '3.11', '负', '输', '小']
    ['墨西乙', '19-10-25', '1 亚特兰特', '2-1(0-1)', '3-2', '塞拉亚 1', '1.06', '半球', '0.76', '2.05', '3.11', '3.45', '胜', '赢', '大']
    ['墨西乙', '19-03-16', '亚特兰特', '1-2(1-1)', '3-1', '塞拉亚', '0.82', '半 /一', '1.02', '1.61', '3.60', '4.93', '负', '输', '大']
    ['墨西乙', '18-10-21', '2 塞拉亚', '1-0(1-0)', '1-3', '亚特兰特 1', '1.03', '平手', '0.81', '2.67', '3.11', '2.45', '负', '输', '小']
    ['墨西乙', '18-01-21', '塞拉亚', '2-1(2-1)', '2-4', '亚特兰特', '0.96', '平 /半', '0.86', '2.14', '3.13', '3.19', '负', '输', '大']
    ['墨西乙', '17-08-05', '亚特兰特', '1-0(0-0)', '3-3', '塞拉亚', '1.12', '平 /半', '0.71', '2.36', '3.07', '2.82', '胜', '赢', '小']
    ['墨西乙', '17-02-04', '亚特兰特', '1-2(1-2)', '6-2', '塞拉亚', '0.85', '半球', '0.97', '1.87', '3.29', '3.84', '负', '输', '大']
    ['墨西乙', '16-11-27', '塞拉亚', '0-0(0-0)', '7-3', '亚特兰特', '0.82', '半球', '1.02', '1.84', '3.35', '3.83', '平', '赢', '小']
    ['墨西乙', '16-11-24', '亚特兰特', '1-0(0-0)', '3-0', '塞拉亚', '0.94', '平 /半', '0.90', '2.11', '3.15', '3.15', '胜', '赢', '小']
    ['近', '10', '场,', '胜出', '3', '场,平局', '1', '场,输', '6', '场,', '胜率:30%', '赢盘率:40%', '大球率:50%', '单率:90%']
    ```
    gimp
        26
    gimp  
       2021-02-15 19:31:52 +08:00   9
    “不耻下问” 意思是指向地位、学问不如自己的人请教而不感到丢面子。

    向别人问问题应该用 “不吝赐教”
    qazwsxkevin
        27
    qazwsxkevin  
       2021-02-15 19:44:22 +08:00
    学习是一回事,
    如果真要拿这个做什么事情,体育数据方面还真不如直接买数据回来划算,如飞 jing,sopr*rader 之类,比起去爬这些网页要丰富
    Lemeng
        28
    Lemeng  
       2021-02-15 22:02:49 +08:00
    怎么评论区好像吵起来了?
    www5070504
        29
    www5070504  
       2021-02-15 22:05:02 +08:00   1
    不耻下问 有意思嗷
    learningman
        30
    learningman  
       2021-02-15 22:19:42 +08:00   1
    @blodside 但我再菜逼的时候也不会像楼主这样生猛啊
    这种骂你一句里面都是有有用的信息的,算指导的
    xJogger
        31
    xJogger  
       2021-02-15 22:26:50 +08:00
    @sairoa
    +1
    复制为 curl 请求,再用 https://curl.trillworks.com/ 转成 python 代码简直太实用了,好多机械性步骤都省了。
    LudwigWS
        32
    LudwigWS  
       2021-02-15 22:30:28 +08:00 via iPhone
    @gimp 应该说请不吝赐教
    maloneleo88
        33
    maloneleo88  
    OP
       2021-02-15 22:33:16 +08:00
    @musi 嗯,好处就是用处广泛。但跟直接拿数据响应没法比啊,速度差太多了。

    @blodside 好的。

    @codists 谢谢雄对,在研究筛选数据。

    @qazwsxkevin 就是爱好,喜欢看足球篮球,有时候也玩,那种数据类卖的很贵吧。也没盈利目的。

    @gimp 那就不耻上问吧,呵呵


    问问题,而已。 你帮我, 我帮他。。

    愿意怼人玩去微博不好么,没别的,就是看不惯有些人
    maloneleo88
        34
    maloneleo88  
    OP
       2021-02-15 22:36:57 +08:00
    @xJogger
    @sairoa

    谢谢,随后研究下吧,看起来有点深奥。
    maloneleo88
        35
    maloneleo88  
    OP
       2021-02-15 22:44:03 +08:00
    不吝赐教,主楼就说了,不要咬文嚼字了

    众生百相~ :D
    qazwsxkevin
        36
    qazwsxkevin  
       2021-02-15 23:47:09 +08:00
    @maloneleo88 不知道价格,只是知道国内有几家这样的网站是向这些相同的数据公司买的数据(貌似有版权)
    maloneleo88
        37
    maloneleo88  
    OP
       2021-02-16 01:26:47 +08:00 via Android
    @qazwsxkevin 纯属个人喜好,飞鲸,纳米这些数据公司有卖接口,少说一年几万,太贵了
    Cusmate
        38
    Cusmate  
       2021-02-16 19:10:11 +08:00 via Android
    第一层楼主的回复竟有点别致
    maloneleo88
        39
    maloneleo88  
    OP
       2021-02-16 19:28:03 +08:00
    刚刚把这个爬虫彻底写好了(实际是三个,前,今,后),包括异常。

    用了一个星期从什么也不会到 requests 找不到数据,selenium (死慢),再到昨天来问问题,终于拨云见日。

    隆重感谢
    @matrix67
    @gongym
    @darer
    @sairoa

    简单的爬虫看来以后我能照着这个框架慢慢举一反三了。感谢大家! 万分感谢,这几天天天就睡五个小时没白熬~欣喜至极!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5614 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 06:38 PVG 14:38 LAX 23:38 JFK 02:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86