我正在尝试抓取一个金融网站来制作一个应用程序来比较来自其他各种网站(谷歌/雅虎金融)的金融数据的准确性。
我试图抓取的 URL(特别是股票的“关键数据”,如市值、交易量等)在这里:
https://www.marketwatch.com/investing/stock/sbux
我已经弄清楚(在其他人的帮助下)必须构建一个 cookie 并随每个请求一起发送,以便页面显示数据(否则页面 html 响应几乎返回空)。
我使用 Opera/Firefox/Chrome 浏览器查看从浏览器发回的 HTTP 标头和请求。我得出的结论是,需要完成 3 个步骤/请求来接收所有 cookie 数据并逐个构建它。
步骤/请求 1
只需访问上面的 URL。
GET /investing/stock/sbux HTTP/1.1
Host: www.marketwatch.com:443
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.44
HTTP/1.1 200 OK
Cache-Control: max-age=0, no-cache, no-store
Connection: keep-alive
Content-Length: 579
Content-Type: text/html; charset=utf-8
Date: Sun, 26 Aug 2018 05:12:16 GMT
Expires: Sun, 26 Aug 2018 05:12:16 GMT
Pragma: no-cache
步骤/请求 2
我不确定这个“POST”URL 来自哪里。但是,使用 Firefox 并查看网络连接时,此 URL 会在“跟踪堆栈”选项卡中弹出。同样,如果每个人都相同或随机创建,我不知道从哪里获取此 URL。我也不知道正在发送什么 POST 数据或 X-Hash-Result 或 X-Token-Value 的值来自哪里。但是,此请求在响应标头中返回一个非常重要的值,其中包含以下行:'Set-Cookie: ncg_g_id_zeta=701c19ee3f45d07b56b40fb8e313214d'这部分 cookie 对于下一个请求至关重要,以便返回完整的 cookie 并接收数据网页。
POST /149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/fingerprint HTTP/1.1
Host: www.marketwatch.com:443
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Content-Type: application/json; charset=UTF-8
Origin: https://www.marketwatch.com
Referer: https://www.marketwatch.com/investing/stock/sbux
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.44
X-Hash-Result: 701c19ee3f45d07b56b40fb8e313214d
X-Token-Value: 900c4055-ef7a-74a8-e9ec-f78f7edc363b
HTTP/1.1 200 OK
Cache-Control: max-age=0, no-cache, no-store
Connection: keep-alive
Content-Length: 17
Content-Type: application/json; charset=utf-8
Date: Sun, 26 Aug 2018 05:12:16 GMT
Expires: Sun, 26 Aug 2018 05:12:16 GMT
Pragma: no-cache
Set-Cookie: ncg_g_id_zeta=701c19ee3f45d07b56b40fb8e313214d; Path=/; HttpOnly
步骤/请求 3
这个请求被发送到带有在步骤 2 中获取的 cookie 的原始 URL。然后在响应中返回完整的 cookie,可以在步骤 1 中使用它来避免再次执行步骤 2 和 3。它还将显示整页数据。
GET /investing/stock/sbux HTTP/1.1
Host: www.marketwatch.com:443
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: ncg_g_id_zeta=701c19ee3f45d07b56b40fb8e313214d
Referer: https://www.marketwatch.com/investing/stock/sbux
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.44
HTTP/1.1 200 OK
Cache-Control: max-age=0, no-cache, no-store
Connection: keep-alive
Content-Encoding: gzip
Content-Length: 62944
Content-Type: text/html; charset=utf-8
Date: Sun, 26 Aug 2018 05:12:17 GMT
Expires: Sun, 26 Aug 2018 05:12:17 GMT
Pragma: no-cache
Server: Kestrel
Set-Cookie: seenads=0; expires=Sun, 26 Aug 2018 23:59:59 GMT; domain=.marketwatch.com; path=/
Set-Cookie: mw_loc=%7B%22country%22%3A%22CA%22%2C%22region%22%3A%22ON%22%2C%22city%22%3A%22MARKHAM%22%2C%22county%22%3A%5B%22%22%5D%2C%22continent%22%3A%22NA%22%7D; expires=Sat, 01 Sep 2018 23:59:59 GMT; domain=.marketwatch.com; path=/
Vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-machine: 8cfa9f20bf3eb
概括
总而言之,步骤 2 是获得剩余 cookie 的最重要的部分......但我无法弄清楚这 3 件事:
1) POST url的来源(未嵌入原始页面,每个人的URL都相同还是由网站随机生成)。
2) POST 请求中发送的数据是什么?
3) X-Hash-Result 和 X-Token-Value 来自哪里?是否需要在请求的标头中发送?