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

2019-02-02 16:07:36 +08:00
 smyle
网上的爬虫快餐教程几乎都是 F12,自己操作一遍,然后照葫芦画瓢把相应关键字段复制到自己的代码里,发送

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

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

插楼补充下吧:
确实如一些筒子所说,有更好的工具 webdriver、selenium 等
不过这个提问的目的倒不是想解决实际问题,我主要就是想了解浏览器是怎么做的,可以理解为纯粹是好奇而已
ThirdFlame
2019-02-02 16:39:48 +08:00
读下 html 啊 ,了解下 form
smyle
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
2019-02-02 16:42:03 +08:00
楼主的想问的就是如何智能地模拟浏览器的行为,但实际上你去学一下前端就知道其实没有什么智能的办法来模拟。

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

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

当然,这只是不明白的地方之一,看样子还是前端知识太匮乏了
gamexg
2019-02-02 17:27:44 +08:00
@smyle #18 cookie 规则 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
你说的那个情况我怀疑图片是另一个域名,所以不发送 cookie。
lhx2008
2019-02-02 17:37:25 +08:00
其实就是效率问题,浏览器一秒爬两页就不错了,自己发 HTTP 包一秒至少爬十页。至于为什么效率慢,因为渲染要时间。就像你玩游戏,你如果能不开游戏直接发包玩,就可以代练几十几百个玩家,但是你开客户端玩最多开 10 个。
那么,有没有智能的爬虫呢?也是有的,比如什么火车浏览器,但是说到底还是很难模拟所有情况,还有要高速爬取的话,还要解决代理池,数据清洗等等。所以事情远没有那么简单

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/532678

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX