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 · 4520 次点击
    这是一个创建于 1137 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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)
    #列表编码为 gb2312,所以需要转一下为 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   ·   我们的愿景   ·   实用小工具   ·   5729 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:50 · PVG 09:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.