【问题标题】:PHP scrapy cURL request not workingPHP scrapy cURL请求不起作用
【发布时间】:2017-10-18 05:52:39
【问题描述】:

我正在实施一个抓取蜘蛛来抓取包含房地产报价的网站。该网站包含房地产经纪人的电话号码,可以通过 ajax 发布请求来检索。

要获取电话号码,我必须从 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;

请帮助我,我为此工作了几个小时,一无所获。

【问题讨论】:

  • 如果它曾经有效,那么他们可能改变了一些东西。就像 HTML 或一些登录问题,或者他们只是阻止了你。从另一个 IP 地址尝试,看看它是否有效。
  • 你需要javascript,culr不支持,尝试使用selenium或类似的
  • 我正在尝试通过 REST Client Chrome 发送此请求,但仍然一无所获...
  • {"status":"error","message":"Spróbuj wykonać operację ponownie. Jeśli to nie pomoże, sprawdź czy masz włączoną obsługę JavaScript w przeglądarce."}
  • 我有同样的答案,我认为电话号码在服务器中受到保护...正确答案是 {"value":["515 174 616"]}

标签: php ajax curl post


【解决方案1】:

{"status":"error","message":"Spróbuj wykonać operację ponownie. Jeśli to nie pomoże, sprawdź czy masz włączoną obsługę JavaScript w przeglądarce。”}

正如我在评论中提到的,您需要 JavaScript 才能获取电话号码。实现此目的的一种方法是使用selenium,这是一个 python 示例:

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

注意事项:

1 - 安装 Selenium:

pip install selenium

2 - 下载geckodriver
3 - 将C:/path_to 替换为您保存geckodriver.exe 的path。
4 - 将 C:/path_to 添加到您的环境中。
5 - 重新启动系统。
6 - 运行python name_of_script.py,将显示电话号码。

以上步骤假设您使用的是 Windows 机器。

【讨论】:

  • 谢谢,它有效,但我仍然在想为什么不使用 REST 客户端。
  • 因为你需要 javascript,而 curl 没有。
  • 由于声誉低,我无法点击投票 1+,但我点击了接受答案。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-04-08
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
相关资源
最近更新 更多