有没有办法从不提供开放API的网站/应用程序检索数据

时间:2019-07-05 03:36:50

标签: web-scraping headless

例如,假设我正在构建一个应用程序,其中用户根据其UPC代码搜索衬衫。该应用程序的工作是在其他各种零售商处找到这件衬衫。零售商A具有可轻松用于定位产品的API。但是,零售商B没有向开发人员开放的API。

开发人员如何处理零售商B?

我提出的想法是:

  • 使用无头浏览器加载零售商B的网站,执行搜索并爬网该网页。 (听起来很糟糕)
  • 使用无头浏览器加载零售商B的网站,执行搜索,拦截网络流量。 (更好,但仍然不是很好)

以前是否有人遇到过此问题,或者是否有人知道解决此问题的现有技术或方法?我从不了解如果不使用API​​如何处理数据检索。

1 个答案:

答案 0 :(得分:0)

这是我在PHP中使用curl所做的事情。它应该可以帮助您入门。

$url = 'https://newjersey.xxxxxx.net/login';
$cookie="cookie.txt";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt ($ch, CURLOPT_VERBOSE, true);

$result = curl_exec ($ch);
preg_match('/meta content="([^"]+)" name="csrf-token"/', $result, $matches);
$token = $matches[1];
$creds['authenticity_token'] = $token;

print "login page with token $token\n";

curl_setopt ($ch, CURLOPT_URL, 'https://newjersey.xxxxx.net/auth/identity/callback');
curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($creds));
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);

登录后,您可以使用正则表达式获取所需的数据。