V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smyle
V2EX  ›  程序员

关于爬虫:单击按钮后,真实的浏览器如何判断应该发送什么、是否需要带服务端返回的 cookie 等等?

  •  
  •   smyle · 2019-02-02 16:07:36 +08:00 · 2458 次点击
    这是一个创建于 2120 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网上的爬虫快餐教程几乎都是 F12,自己操作一遍,然后照葫芦画瓢把相应关键字段复制到自己的代码里,发送

    问题是,浏览器自身显然是根据网页内容(或者返回的 header 等)就能判断应该发送什么:是 get 还是 post、登录表单中的用户名 key 名是 user、username 还是 user_name、哪些请求用 ajax、哪些内容用 bs64 解密、哪些请求要带 cookies 哪些不用带……等等,都是浏览器自己撸起袖子直接干,根本不需要像爬虫教程里那样先 F12 观察一遍

    如果了解这些的话,有时写请求代码应该比 F12 观察更精准吧?
    有没有大佬能简单介绍一下最常用的一些情况,或者推荐下合适的文章或书。thx
    22 条回复    2019-02-03 16:13:07 +08:00
    jybox
        1
    jybox  
       2019-02-02 16:14:39 +08:00
    「照葫芦画瓢把相应关键字段复制到自己的代码」这就是在走「捷径」嘛,你不走捷径就上 chrome-headless 呀。
    gabon
        2
    gabon  
       2019-02-02 16:18:48 +08:00 via Android
    HTTP 协议
    smyle
        3
    smyle  
    OP
       2019-02-02 16:19:05 +08:00 via Android
    @jybox f12 应付下简单的一次性操作倒是 OK,但有时复杂的网页光是看 f12 发送的那一大堆东西都头大,我是想如果能仿照浏览器的解析、计算、发送过程来做的话,有时应该会比观察 f12 顺手
    dorothyREN
        4
    dorothyREN  
       2019-02-02 16:19:43 +08:00
    webdriver 多好。
    gabon
        5
    gabon  
       2019-02-02 16:20:16 +08:00 via Android
    抓包最准
    flight2006
        6
    flight2006  
       2019-02-02 16:26:10 +08:00   ❤️ 1
    爬虫是啥,爬虫是模拟别人网站的前端请求,你在不知道人后端 api 的情况下肯定只能 F12 看人家前端发的真实请求长啥样才能模拟?
    smyle
        7
    smyle  
    OP
       2019-02-02 16:30:58 +08:00
    不知道怎么在顶层进行补充回复……

    插楼补充下吧:
    确实如一些筒子所说,有更好的工具 webdriver、selenium 等
    不过这个提问的目的倒不是想解决实际问题,我主要就是想了解浏览器是怎么做的,可以理解为纯粹是好奇而已
    ThirdFlame
        8
    ThirdFlame  
       2019-02-02 16:39:48 +08:00
    读下 html 啊 ,了解下 form
    smyle
        9
    smyle  
    OP
       2019-02-02 16:40:21 +08:00
    我认为浏览器本质上和爬虫没什么区别,都是数据收发、解析、存储罢了,只不过浏览器需要集合很多工具一起工作
    @flight2006 至于我的问题,你可以理解为,我就是一个浏览器,我怎么根据服务器返回的数据,得知下一步发送什么内容?
    例如:使用者在网页上填了用户名 abc,OK 了,发送。那我发送表达的时候,用户名的 key 名应该写什么?是 user、username、user_name、name 还是 id ?这个网站也许叫 user,另一个网站也许叫 username
    这显然是浏览器通过解析网页内容得到的啊

    PS:就用户名、密码而言,我看了下似乎在 html 用户名对应属性里,有一个字段似乎就是要发送的 key。但我不确定是不是 100%都这样
    AX5N
        10
    AX5N  
       2019-02-02 16:42:03 +08:00
    楼主的想问的就是如何智能地模拟浏览器的行为,但实际上你去学一下前端就知道其实没有什么智能的办法来模拟。

    比如 username 还是 user_name 这个问题,实际上是人家网站只给你一个 username = 的选项让你去填,并且已经写死当你点击提交的时候发送的是 username 这个变量,所以浏览器根本就不需要知道到底是 username 还是 user_name。因为你就只有一种选择,就像这段代码一样:
    a =;
    b = a+5;
    现在请你去填 a 的内容

    另一种情况则是这样的:有的网站是当你点击提交后,就会调用一个函数,然后这个函数可能会去再调用别的函数来生成一些必要信息,也可能这些信息是在加载网页时候就已经调用函数产生的全局变量,函数直接获取就行。这你咋猜,倒头来还是要手动去找最初调用的那个函数。
    AX5N
        11
    AX5N  
       2019-02-02 16:44:28 +08:00
    @AX5N 要猜也不是不可以,用你的语言把 javascript 解析一遍后再自己调用一遍。
    smyle
        12
    smyle  
    OP
       2019-02-02 16:49:51 +08:00
    @AX5N 比较接近这个意思了
    你的意思是说:
    所有的内容包括 username 等,某些网站也许不写在 html 里(或者 html 里写一个助记的名字,但最终发送的完全不一样),而是鼠标点击提交后,浏览器后台计算、生成再发送吗?
    ThirdFlame
        13
    ThirdFlame  
       2019-02-02 16:52:56 +08:00
    @smyle 除了 html 还有 javascript
    smyle
        14
    smyle  
    OP
       2019-02-02 16:54:45 +08:00 via Android
    @AX5N 是倒是,都是人开发的,浏览器能做到的,写爬虫的人必然也能做。就看投入产出值不值得了
    crab
        15
    crab  
       2019-02-02 16:58:33 +08:00
    有不少 cookies 是 AD 类不需要,有登陆的看响应的 cookies 就可以了。
    smyle
        16
    smyle  
    OP
       2019-02-02 17:02:49 +08:00
    @AX5N 还想确认一点:是不是所有的 js 调用,追根溯源都来自 html (/css?) 里的某个关键部分?比如点击按钮的 html 属性里有一个调用某 js 函数的 method ——也许不是这么做,我就是猜一个可能的例子
    还是说连这些通知浏览器发起调用的入口都是完全在后台,前端看不见的?
    AX5N
        17
    AX5N  
       2019-02-02 17:06:23 +08:00
    @smyle 应该都是在前端? 这方面我也是个半桶水,你还是问问其他的大佬。
    smyle
        18
    smyle  
    OP
       2019-02-02 17:06:39 +08:00
    @crab 主要是我发现登录同一个页面后,第一个请求开始可能会带 cookies,但后续自动下载图片等请求可能就是没有 cookie 的了,但就是不清楚浏览器根据什么来判断某个请求要不要带 cookie

    当然,这只是不明白的地方之一,看样子还是前端知识太匮乏了
    gamexg
        19
    gamexg  
       2019-02-02 17:27:44 +08:00
    @smyle #18 cookie 规则 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
    你说的那个情况我怀疑图片是另一个域名,所以不发送 cookie。
    lhx2008
        20
    lhx2008  
       2019-02-02 17:37:25 +08:00 via Android
    其实就是效率问题,浏览器一秒爬两页就不错了,自己发 HTTP 包一秒至少爬十页。至于为什么效率慢,因为渲染要时间。就像你玩游戏,你如果能不开游戏直接发包玩,就可以代练几十几百个玩家,但是你开客户端玩最多开 10 个。
    那么,有没有智能的爬虫呢?也是有的,比如什么火车浏览器,但是说到底还是很难模拟所有情况,还有要高速爬取的话,还要解决代理池,数据清洗等等。所以事情远没有那么简单
    Hieast
        21
    Hieast  
       2019-02-03 12:14:58 +08:00 via Android
    楼主需要去找一两篇讲浏览器架构的文章读一读
    megachweng
        22
    megachweng  
       2019-02-03 16:13:07 +08:00 via iPhone
    典型的想的太多,学的太少。必经阶段加油
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1169 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:19 · PVG 02:19 · LAX 10:19 · JFK 13:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.