如何在爬取指定网站数据时获取并传递正确的Cookies?
我需要爬取https://pretrazivac-obrta.gov.hr/的信息,点击「Traži」按钮会触发POST请求至https://pretrazivac-obrta.gov.hr/pretraga?izvrsiDohvat,POST数据的构造没有问题,但Cookie获取存在障碍:通过curl转换的代码仅在Cookie过期前可用,无法长期有效。
所需完整Cookie示例如下:
{ '__utmz': '150669943.1685031401.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)', '__utmc': '150669943', 'TS00000000076': '08cc731c44ab280009cbed137f8d48311c7fd5bc05553b3acd6b9d0d9449bd40409cf070fa5896acd7bdc232e57afeac086dc7f28109d0004282940bbf620471f904e4ee720e9e52120116681fa2dde9d3ccc250787649e7e86b7e5d50be6800de490c2492f2911f1cb8b9b82c70dcd95a83f589b4250a37bc0579e8061d009baf28546b163c2119e64150c3e00efda065e0ad17693fe9eecaff9c4b8d5c3d30d46863b939b59dbbb1b3d1eceebef41884eb2f3ac26595ebfb5a50745e2507d241697774cde6c81391b3915f901ecd3135765c89914b283e23c41da760e249a9a0bb1dd32cca209d4c88b5de3e0a421f9ebba95d421b56e461da2bb92925fd2a5e0def302e2921e8', 'TSPD_101_DID': '08cc731c44ab280009cbed137f8d48311c7fd5bc05553b3acd6b9d0d9449bd40409cf070fa5896acd7bdc232e57afeac086dc7f28106380041b623f71368ac6b70682da512c2abc24018a2c05e8fb962f71b606f0a158f0bbb9765499fad2aa909a56a1d77a2df7e5b856d0b5e9cc275', 'JSESSIONID': 'srv01~4EBB883F48EE71B2DD61BDE78CD46B45', 'TS01a2590c': '01402d66b96cd92a73d364af64837992731a9dffaa0320858aaf7d01ff45906ed34e34be58bb8cbc0721f315ee640c0292537d402ca30df3621f172ec8226a6d728ba91074', 'TSPD_101': '08cc731c44ab2800a5ab5326d7601cfa453f25bb4696ef0cd9a28538f30faca54237a1836b24ec1bc41da38bbff56a65087190c3fb0518000d84d6b7cd598b945ccda15be985d454811e1204a60a8de4', '__utma': '150669943.1828940763.1685031401.1685040031.1685049060.3', '__utmt': '1', '__utmb': '150669943.1.10.1685049060', 'TS9a3ff16f029': '08cc731c44ab2800f487994d79d6b30a26eac66b279ff7e77a109eae31e22261b23ee80416eee3308ca52726cb4e2872', 'TS74048527027': '08cc731c44ab20008fad2e02e7a4354541f21179ddc82d2d7bce1475deed792eb6158f3ffa00ff0f087eaa5f81113000238281e97b3866df007962363c348138148ed4bfa679013825ce225893f0bc5830b5bd0d1cd239b11c4192faf8209bb9', 'TS9a3ff16f077': '08cc731c44ab2800ee499112ef23f263d4ec8d03a2f452ddb1a1deae2db4b054ceb5acd452b867cf961d7ab66c3f5ccb0819b09526172000c3b1c62a1f5c2f3394c546454ec0b4721bf6c3059cffc133e7fb811bee527d4b' }
已尝试的方法
使用requests库
直接请求POST接口只能拿到单个Cookie,用该Cookie发送请求会被拒绝:
import requests headers = { 'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36', } session = requests.Session() response = session.get("https://pretrazivac-obrta.gov.hr/pretraga?izvrsiDohvat", headers=headers) print(response.cookies.get_dict())
返回的Cookie:
{'TS74048527027': '08cc731c44ab2000eff496fb99f369e0643884fa0f6804056b1bb93d0d244c5864808e6247cd662208d24b50c01130003ecb0ddc3ea6fdacc9b63cbd5be96a0fce282beb2ef736208faf7ae21372e434564afe0e2d22b68ba75bad8aee8080f2'}
请求被拒绝的响应:
b"<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: < 6060970845093779227><br><br><a href='javascript:history.back();'>[Go Back]</body></html>"
使用Playwright库
虽然能获取更多Cookie,但用这些Cookie单独发送请求仍会被拒绝:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.firefox.launch(headless=True) context = browser.new_context() page = context.new_page() page.goto("https://pretrazivac-obrta.gov.hr/pretraga") page.get_by_role("button", name="Traži").click() cookies = context.cookies() cj = {} for cookie in cookies: name = cookie["name"] value = cookie["value"] cj[name] = value
解决方案建议
1. 直接在Playwright上下文内发送请求
网站的TS开头Cookie是Akamai反爬系统生成的,需要浏览器执行JS完成完整的会话验证,单独提取Cookie会丢失部分验证信息(比如JS生成的隐形参数、浏览器指纹)。正确的做法是在同一个Playwright上下文内完成页面访问、点击操作和POST请求,自动携带所有有效验证信息:
from playwright.sync_api import sync_playwright import time with sync_playwright() as p: # 使用Chrome新无头模式,更接近真实浏览器行为 browser = p.chromium.launch(headless="new") context = browser.new_context( user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" ) page = context.new_page() # 访问页面并等待完全加载 page.goto("https://pretrazivac-obrta.gov.hr/pretraga") page.wait_for_load_state("networkidle") # 模拟用户延迟,避免触发反爬 time.sleep(1) # 点击搜索按钮,等待页面响应 page.get_by_role("button", name="Traži").click() page.wait_for_load_state("networkidle") # 直接在当前上下文发送POST请求,自动携带所有有效Cookie和验证信息 post_data = { # 替换为你实际需要发送的POST数据 } response = context.request.post( "https://pretrazivac-obrta.gov.hr/pretraga?izvrsiDohvat", headers={"Content-Type": "application/json"}, data=post_data ) print("响应状态码:", response.status) print("响应内容:", response.text()) # 若需后续请求,直接复用该context即可 browser.close()
2. 优化Playwright的反爬规避策略
- 使用Chrome的
headless="new"模式,而非旧的无头模式,更接近真实浏览器的指纹特征; - 增加页面等待时间,确保所有JS脚本执行完成,生成完整的Cookie链;
- 避免快速连续操作,模拟真实用户的点击间隔;
- 不要修改默认的浏览器参数(如viewport),保持默认的浏览器环境。
3. 若需提取Cookie供其他工具使用
如果必须提取Cookie,需确保:
- 在页面完全加载(
networkidle状态)且点击操作完成后提取所有Cookie; - 发送请求时严格匹配浏览器的所有请求头(包括
Referer、Accept-Language等); - 注意部分Cookie是
HttpOnly属性,无法通过JS获取,但Playwright的context.cookies()可以获取到这类Cookie。
但这种方式仍有较高概率被Akamai检测到,因为缺少浏览器环境的动态验证,建议优先使用Playwright上下文直接请求的方式。
内容的提问来源于stack exchange,提问作者G0000000se
相关产品推荐
相关产品推荐

