2017-05-18 23 views
1

私は、スパイシースパイダーを実装して不動産を含むウェブサイトをクロールしています。このサイトには不動産業者に電話番号が記載されています。PHP scrapy cURLリクエストが機能しない

電話番号を取得するには、URLからIDを取得し、次にソースcsrfTokenから取得し、ID付きの特別なURLでPOSTで送信します。このメソッドはうまくいきましたが、昨日からは機能しませんでした。

マイコード:

$urlSite = "https://www.otodom.pl/mazowieckie/oferta/piekne-mieszkanie-na-mokotowie-do-wynajecia-ID3ezHA.html"; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
    curl_setopt($ch, CURLOPT_URL, $urlSite); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $result = curl_exec($ch); 

    curl_close($ch); 

    preg_match("/csrfToken = '(.+?)'/", $result, $output_array); 
    preg_match("/ID(.+?).html/", $urlSite, $output_array_id); 

    $token = $output_array[1]; 
    $id = $output_array_id[1]; 

    $url = "https://www.otodom.pl/ajax/mazowieckie/misc/contact/phone/" . $id . "/"; 

    $headers = [ 
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Encoding: gzip, deflate, br', 
     'Accept-Language: pl,en-US;q=0.8,en;q=0.6,ru;q=0.4', 
     'Cache-Control: no-cache', 
     'Content-Type: application/x-www-form-urlencoded; charset=UTF-8', 
     'Content-Length: 74', 
     'Host: www.otodom.pl', 
     'Referer: ' . $urlSite, 
     'User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36' 
    ]; 

    $data = array(
     'CSRFToken' => $token 
     ); 

    $data_string = http_build_query($data); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

    $phone = utf8_decode(curl_exec($ch)); 

    curl_close($ch); 

    echo $phone; 

私はこの数時間と何のために働いて、私を助けてください。

+0

これまで働いていたのであれば、おそらく何か変わってしまったでしょう。 HTMLやいくつかのログインの問題のように、あるいはあなたをブロックしました。別のIPアドレスから試して、動作するか確認してください。 –

+0

あなたはサポートしていないjavascriptが必要です。セレンなどを使用してみてください –

+0

REST Client Chromeでこのリクエストを送信しようとしていましたが、まだ何も... – Mat

答えて

0

{ "ステータス": "エラー"、 "メッセージ": "SpróbujwykonaćoperacjęponownieJeśli NIEpomożeに、sprawdźCZY maszwłączonąobsługęのJavaScript przeglądarceW"}

として私は私のコメントに言及した、あなたは電話番号を取得するためにJavaScriptが必要です。

import time 
from selenium import webdriver 
geckodriver = 'C:/path_to/geckodriver.exe' 
driver = webdriver.Firefox(executable_path = geckodriver) 
driver.get("https://www.otodom.pl/mazowieckie/oferta/piekne-mieszkanie-na-mokotowie-do-wynajecia-ID3ezHA.html") 
driver.find_element_by_class_name("phone-spoiler").click() 
time.sleep(2) 
print driver.find_element_by_class_name("phone-number").text 
# 515 174 616 

注:seleniumを使用しているこれを達成する1つの方法は、ここではPythonの例です

1 - インストールセレン:

pip install selenium 

2からgeckodriver
をダウンロード 3 - C:/path_toをに置き換えてください3234を保存した場所geckodriver.exe
4 - ご使用の環境にC:/path_toを追加してください。
5 - システムを再起動します。
6 - python name_of_script.pyを実行すると、電話番号が表示されます。

上記の手順では、Windowsマシンを使用していることを前提としています。

+0

ありがとう、それは動作しますが、私はまだRESTクライアントで作業していないと思っています。 – Mat

+0

あなたはカールにはない** javascript **が必要なので、 –

+0

評判が低いため投票1+をクリックできませんが、私は受諾回答をクリックしています。あなたの助けをもう一度ありがとう! – Mat

関連する問題