PHP cURL在Web服务器被识别为机器人,本地运行正常求原因
问题:本地正常的PHP cURL请求,部署到服务器就触发验证码
我用了一段PHP cURL代码,本地运行能正常获取亚马逊页面内容,但部署到Web服务器后,就会收到验证码验证,被识别成机器人。我已经尝试随机切换User-Agent字符串、循环发起请求,但问题还是一样:本地没问题,服务器端必出验证码。想知道这是为什么?
原始代码
$request = array(); //$request[] = 'host:www.amazon.com'; $request[] = 'Connection: keep-alive'; $request[] = 'Pragma: no-cache'; $request[] = 'Cache-Control: no-cache'; $request[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'; $request[] = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0';//Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'; $request[] = 'DNT: 1'; $request[] = 'Accept-Encoding: gzip, deflate'; $request[] = 'Accept-Language: en-US,en;q=0.8'; $url = 'https://www.amazon.de/Wenn-Dunkeln-Sterne-funkeln-Puste-Licht-Buch/dp/3480236529/ref=sr_1_3?keywords=buch&qid=1670662644&sr=8-3'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $request); curl_setopt($ch, CURLOPT_ENCODING,""); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT,10); curl_setopt($ch, CURLOPT_FAILONERROR,true); $output = curl_exec($ch);
调整后的代码(问题依旧)
我给代码加了随机User-Agent列表,循环请求多个商品页面,但服务器端还是触发验证码:
$user_agents = array( 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:89.0) Gecko/20100101 Firefox/89.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0', 'Mozilla/5.0 (X11; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0', 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0' ); foreach ($products as $key => $value) { $request = array(); $request[] = 'Connection: keep-alive'; $request[] = 'Pragma: no-cache'; $request[] = 'Cache-Control: no-cache'; $request[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'; $request[] = 'User-Agent: ' . $user_agents[array_rand($user_agents)]; $request[] = 'DNT: 1'; $request[] = 'Accept-Encoding: gzip, deflate'; $request[] = 'Accept-Language: en-US,en;q=0.8'; $url = $value['url']; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_HTTPHEADER, $request); curl_setopt($ch, CURLOPT_ENCODING,""); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT,10); curl_setopt($ch, CURLOPT_FAILONERROR,true); $output = curl_exec($ch); ... }
内容的提问来源于stack exchange,提问作者Michael Schäfer
相关产品推荐
相关产品推荐

