首先,我們需要初始化一個curl的session:
$ch = curl_init();
然后,我們需要設置curl的選項,比如URL、UserAgent、Referer等:
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_REFERER, $referer);
其中,$url表示我們要抓取的URL地址,$user_agent表示UserAgent,$referer表示Referer。這里需要注意的是UserAgent和Referer的設置,因為這些信息可以幫助我們模擬一個真正的瀏覽器,以減少被目標網站屏蔽的可能。
接下來,我們可以設置一些特殊的curl選項,比如COOKIE、POST數據等:
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
curl_setopt($ch, CURLOPT_HEADER, $header);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
其中,$cookie_jar表示COOKIE的存放位置,$header表示是否要包含響應頭信息,$post_data表示POST請求的數據。這些選項的作用可以根據實際情況來選擇,比如我們要登錄一個網站,就需要使用COOKIE來進行模擬登錄,并且需要保存響應頭信息和POST請求的數據。
最后,我們需要執行curl請求,并獲取響應結果:
$response = curl_exec($ch);
curl_close($ch);
其中,$response表示響應結果,curl_close()函數表示關閉curl會話。獲取到響應結果之后,我們就可以對返回的HTML頁面進行解析,從而獲取到需要的數據。
在使用php curl技術來爬取12306購票頁面時,我們需要先模擬一個登錄過程,然后提交查詢請求,最后解析頁面并提取需要的車次信息。下面是一個簡單的示例:
$url = "https://kyfw.12306.cn/otn/login/init";
$header = false;
$cookie_jar = dirname(__FILE__) . "/12306.cookie";
$user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)";
$referer = "https://kyfw.12306.cn/otn/login/init";
$post_data = "username=xxxx&password=xxxx&appid=otn";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
curl_setopt($ch, CURLOPT_HEADER, $header);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$response = curl_exec($ch);
curl_close($ch);
$url = "https://kyfw.12306.cn/otn/leftTicket/queryA";
$header = true;
$cookie_file = dirname(__FILE__) . "/12306.cookie";
$user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)";
$referer = "https://kyfw.12306.cn/otn/leftTicket/init";
$post_data = "leftTicketDTO.train_date=2022-01-12&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_HEADER, $header);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$response = curl_exec($ch);
curl_close($ch);
//解析響應結果,獲取車次信息
...
總結:
使用php curl技術來爬取12306購票頁面,可以很好地規避了手動購票的繁瑣操作,提高了購票的成功率和效率。當然,在使用curl技術時,還需要注意一些細節,比如選擇合適的UserAgent和Referer、充分利用COOKIE等,這些都可以根據實際情況來選擇和調整。