2014-03-03 50 views
5

我試圖拉從蒸汽商店頁面圖像的一些網址,如: http://store.steampowered.com/app/35700/
http://store.steampowered.com/app/252490/如何通過年齡驗證與DOM

下面是我使用的代碼:

$url = 'http://store.steampowered.com/app/35700/'; 
$html = file_get_contents($url); 
$dom = new domDocument; 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    echo $image->getAttribute('src'); 
} 

第一個商店頁面可以正常工作,但第二個頁面重定向到年齡驗證頁面,腳本將從那裏返回圖像。我需要一種方法讓腳本通過年齡驗證並訪問實際的商店頁面。

任何幫助,將不勝感激。

編輯:

這是什麼傳遞給當時代表單提交的服務器:它設置

snr=1_agecheck_agecheck__age-gate&ageDay=1&ageMonth=January&ageYear=1979 

和餅乾:

lastagecheckage=1-January-1979; expires=Tue, 03 Mar 2015 19:53:42 GMT; path=/; domain=store.steampowered.com 
birthtime=662716801; path=/; domain=store.steampowered.com 

EDIT2:

我可以使用cURL設置cookie,但它們不會被DOM loadHTML使用,所以我得到了相同的結果s之前。我需要一種方法讓loadHTML使用我設置的特定cookie,或者另一種方法抓取將使用由cURL設置的cookie的圖像URL。

+3

我想像你通過,你可以通過螢火蟲或類似挖掘特定值,只要它不動,然後你有你的API呼籲被允許遵循重定向。 –

+0

我發現了年齡檢查表單的代碼,以及它設置的cookie,但我不知道該從哪裏去。 (編輯與信息的主要帖子) – Martok

+0

您可能需要使用類似cURL的東西來處理獲取cookie,然後將它們存儲在第二個請求中使用。 –

回答

5

解決!這裏的工作代碼:

$url = 'http://store.steampowered.com/app/35700/'; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_COOKIE, "birthtime=28801; path=/; domain=store.steampowered.com"); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec($ch); 

$dom = new domDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($result); 
$dom->preserveWhiteSpace = false; 

$images = $dom->getElementsByTagName('img'); 
foreach ($images as $image) { 
    $src = $image->getAttribute('src'); 
    echo $src.PHP_EOL; 
} 

curl_close($ch); 
4

你要找的PHP的答案,但我試圖做同樣的事情在python,這是最相關的問題。你的PHP答案幫了我,所以也許一個Python解決方案將幫助某人。使用python-requests在Python 2.7我的解決辦法:

import requests 

    url = 'http://store.steampowered.com/app/252490/' 
    cookie = { 
      'birthtime' : '28801', 
      'path' : '/', 
      'domain' : 'store.steampowered.com' 
      } 

    r = requests.get(url, cookies=cookie) 
    assert (r.status_code == 200 and r.text.find('Please enter your birth date to continue') < 0), ("Failed to retrieve page for {url}. Error={code}.".format(url=url, code=r.status_code)) 

    print r.text.encode('utf-8')