关于爬虫:单击按钮后,真实的浏览器如何判断应该发送什么、是否需要带服务端返回的 cookie 等等? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
smyle
V2EX    程序员

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

 
  •   smyle 2019-02-02 16:07:36 +08:00 2707 次点击
    这是一个创建于 2446 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网上的爬虫快餐教程几乎都是 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     Solana     5441 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:05 PVG 15:05 LAX 00:05 JFK 03:05
    Do have faith in what you're doing.
    ubao 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