如何使用 Goutte Client for BotDetect Captcha 获取 base64 格式的媒体内容
How to get media content in base64 fromat usnig Goutte Client for BotDetectCaptcha
我正在为办公任务写一个爬虫:
我的 Goutte 客户端代码如下:
$cokie = "JSESSIONID=0000H_WHw_eFPKVUDGxUei7v3PH:1db7cfi4s";
$client = new Client(HttpClient::create(array(
'headers' => array(
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' => 'en-US,en;q=0.5',
'Connection' => 'keep-alive',
'Host' => 'verification.nadra.gov.pk',
"Cookie" => $cokie,
'User-Agent' => 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'
),
)));
$cookie = new Cookie("JSESSIONID", $cokie, null, "/service", "https://example.com/", true, true);
$client->getCookieJar()->set($cookie);
$client->setServerParameter('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0');
$client->followRedirects(true);
$crawler = $client->request('GET', 'https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67');
我必须使用 cookie 发送请求才能获得正确的内容。
https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67
结果还是一样url:
<html>
<head>
<title>botdetectcaptcha (JPEG Image, 250 × 40 pixels)</title></head>
<body><img
src="https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67"
alt="https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67">
</body>
</html>
在浏览器中它工作正常,但问题是当我从这个 url 获取图像时它再次生成没有 cookie 的新图像,这是它不起作用的方式。
我试过以下方法:
base64_encode(file_get_contents("https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67"));
上面发送不带 cookie 的 GET 请求是接收图像的方式对我不起作用。
我已经使用 file_get_contents 发送了与我在 Goutte 客户端中发送的相同的客户端信息
$url = "https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=9d15db63ddc449f1850aad6e3183ce2e";
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: " . $cookie_value ."\r\n" . // check function.stream-context-create on php.net
"Host: https://example.com/\r\n" .
"User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0\r\n" // i.e. An iPad
)
);
$context = stream_context_create($options);
$img_base64 = base64_encode(file_get_contents($url, false, $context));
file_put_contents('img/img_9d15db63ddc449f1850aad6e3183ce2e.png', base64_decode($img_base64));
因为 HTML 和图像是从同一个 URL 提供的,所以你需要定义 Accept
header 并且在你的第一个例子中你期望 text/html’, if you want to get an image you need to send
image/png` 看这里 https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation/List_of_default_Accept_values
我正在为办公任务写一个爬虫: 我的 Goutte 客户端代码如下:
$cokie = "JSESSIONID=0000H_WHw_eFPKVUDGxUei7v3PH:1db7cfi4s";
$client = new Client(HttpClient::create(array(
'headers' => array(
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' => 'en-US,en;q=0.5',
'Connection' => 'keep-alive',
'Host' => 'verification.nadra.gov.pk',
"Cookie" => $cokie,
'User-Agent' => 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0'
),
)));
$cookie = new Cookie("JSESSIONID", $cokie, null, "/service", "https://example.com/", true, true);
$client->getCookieJar()->set($cookie);
$client->setServerParameter('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0');
$client->followRedirects(true);
$crawler = $client->request('GET', 'https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67');
我必须使用 cookie 发送请求才能获得正确的内容。
https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67
结果还是一样url:
<html>
<head>
<title>botdetectcaptcha (JPEG Image, 250 × 40 pixels)</title></head>
<body><img
src="https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67"
alt="https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67">
</body>
</html>
在浏览器中它工作正常,但问题是当我从这个 url 获取图像时它再次生成没有 cookie 的新图像,这是它不起作用的方式。
我试过以下方法:
base64_encode(file_get_contents("https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=508c5eaf74fd4858b0c9debafc319d67"));
上面发送不带 cookie 的 GET 请求是接收图像的方式对我不起作用。
我已经使用 file_get_contents 发送了与我在 Goutte 客户端中发送的相同的客户端信息
$url = "https://example.com/service/botdetectcaptcha?get=image&c=exampleCaptcha&t=9d15db63ddc449f1850aad6e3183ce2e";
$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: " . $cookie_value ."\r\n" . // check function.stream-context-create on php.net
"Host: https://example.com/\r\n" .
"User-Agent: Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0\r\n" // i.e. An iPad
)
);
$context = stream_context_create($options);
$img_base64 = base64_encode(file_get_contents($url, false, $context));
file_put_contents('img/img_9d15db63ddc449f1850aad6e3183ce2e.png', base64_decode($img_base64));
因为 HTML 和图像是从同一个 URL 提供的,所以你需要定义 Accept
header 并且在你的第一个例子中你期望 text/html’, if you want to get an image you need to send
image/png` 看这里 https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation/List_of_default_Accept_values