php实现抓包
PHP实现HTTP抓包方法
使用PHP进行网络抓包通常涉及模拟HTTP请求或拦截网络流量,以下是几种常见实现方式:
使用cURL库发送HTTP请求
cURL是PHP内置的HTTP客户端库,适合主动抓取网页内容:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过SSL验证
$response = curl_exec($ch);
curl_close($ch);
echo $response;
可通过CURLOPT_HEADER设置为true捕获响应头信息。

使用file_get_contents抓取内容
简单GET请求可通过流上下文实现:
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' => "User-Agent: MyCrawler/1.0\r\n"
]
]);
$content = file_get_contents('http://example.com', false, $context);
使用Guzzle HTTP客户端
Guzzle是PHP流行的HTTP客户端库:

require 'vendor/autoload.php';
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://example.com', [
'headers' => ['X-Custom-Header' => 'Value']
]);
echo $response->getBody();
支持异步请求和中间件拦截。
使用mitmproxy中间人代理
对于被动抓包(如手机流量):
- 安装mitmproxy
- 配置设备代理到mitmproxy
- 用PHP解析mitmproxy生成的流量文件:
$harData = json_decode(file_get_contents('dump.har'), true);
foreach ($harData['log']['entries'] as $entry) {
echo $entry['request']['url'] . "\n";
}
使用PCAP扩展捕获原始流量
需安装php_pcap扩展:
$pcap = pcap_open_live('eth0', 65535, true, 1000, $err);
while ($packet = pcap_next($pcap)) {
// 解析原始网络包
// 需要自行处理TCP/IP协议栈
}
pcap_close($pcap);
注意事项
- 遵守目标网站的robots.txt协议
- 设置合理间隔避免被封禁(如
sleep(1)) - 处理重定向和Cookie(
CURLOPT_COOKIEJAR) - 对于JavaScript渲染内容需配合无头浏览器(如Puppeteer PHP版)
复杂场景建议结合正则表达式或DOM解析器(如Symfony DomCrawler)处理抓取内容。






