Merhabalar, daha önce de bu konu ile alakalı yazmıştım ancak sorumu toparlayıp tekrar danışmak istedim çünkü benim için çok önemli bir proje. Bir api yazdım ve bu api ile 2 ayrı siteden veri çekmek istiyorum. Bir siteden sağlıklı veri çekebilirken, diğer siteden captcha' dan dolayı boş sonuç dönüyor. Şimdi aynı siteden daha önce pyhton selenium, bs4 kullanarak veri kazıdım, ancak laravel api ile kazıyamıyorum. Bu bilgileri postmandan test ediyorum.
Burada aklıma gelen yöntemler ise şu şekilde;
- Captcha' nın çözümünü sağlandığım, captcha' yı önce sese sonra yazıya çevirerek bu kısmı atlayan pyhton dosyamı eğer mümkünse laravel api dosyam ile birleştirmek.
- Bir diğer yöntem ise, captcha(pyhton) dosyası ile çalışabilecek bir pyhton servisi yazmak.(Pyhton da servis yazmadığımı belirtmek isterim.)
- Son ve aslında işlem sağlayabilirsem bana en faydalı yöntem ise captcha olayına girmeden laravel servisim ile captcha' yı atlamak. Cookie değiştirerek atlamayı denedim ancak çok yorucu ve sağlıksız bir yöntem oldu. Burada bir nevi captcha' yı kandırmak istiyorum.
Bu yöntemler sadece benim aklıma gelenler illa ki bu şekilde ilerlemek istiyorum şeklinde bir ısrarım yok, sadece mümkün olduğunda hızlı ve pratik bir şekilde işlem sağlamak istiyorum. Mantıksız, hatalı bir şey söylemiş olabilirim kusuruma bakmayın. Ama bana ileteceğiniz fikirlere ve yönlendirmelere çok ihtiyacım var. Şimdiden teşekkür ederim. Bakmak isterseniz diye api kodlarımı da ekliyorum.
<?php
namespace App\Services\Mde;
use App\Core\ServiceResponse;
use App\Interfaces\IPricePredictionService;
class PricePredictionService extends BaseMDeService implements IPricePredictionService
{
/**
* @param mixed $brand
* @param mixed $model
* @param mixed $kilometerFrom
* @param mixed $kilometerTo
* @param mixed $yearFrom
* @param mixed $yearTo
* @param mixed $fuelTypes
* @param mixed $gearBoxes
* @param mixed $powerFrom
* @param mixed $powerTo
*
* @return ServiceResponse
*/
public function getByParameters(
$brand,
$model,
$kilometerFrom,
$kilometerTo,
$yearFrom,
$yearTo,
$fuelTypes,
$gearBoxes,
$powerFrom,
$powerTo
): ServiceResponse
{
$endpoint = $this->baseUrl . '&ms=' . $brand . '%3B' . $model;
$priceList = [];
for ($pageCounter = 1; $pageCounter <= 50; $pageCounter++) {
$parameters = [
'ml' => $kilometerFrom,
'ml%3A' => $kilometerTo, // duzelt
'fr' => $yearFrom, // duzelt
'fr%3A' => $yearTo, // duzelt
'fuel' => implode(' ', $fuelTypes), //ft=DIESEL
'gear' => implode(' ', $gearBoxes), //tr=MANUAL_GEAR
'powertype' => 'kw',
'pw' => $powerFrom, // duzelt
'pw%3A' => $powerTo, // duzelt
'page' => $pageCounter,
];
$response = $this->client->get($endpoint . '?' . http_build_query($parameters), [
'headers' => [
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
//'Accept' => 'application/json',
'Accept-Encoding' => 'gzip, deflate, br',
'Accept-Language' => 'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7',
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' //,
],
]);
$clean1 = str_replace(["\n", "\t", "\r", " "], null, $response->getBody()->getContents());
$clean2 = str_replace(["""], null, $clean1);
$clean3 = preg_replace('~{(.*?)}~', null, $clean2);
$cleanResult = preg_replace('~{(.*?)}~', null, $clean3);
preg_match_all('~<a class="link--muted no--text--decoration result-item" (.*?)</a>~', $cleanResult, $articles);
//return $lists; // bos geliyor.
if ($articles[1]) {
foreach ($articles[1] as $article) {
preg_match('~<span class="h3 u-block" .*?>(.*?)</p>~', $article, $priceObject);
$priceWithCurrency = str_replace(',-', null, $priceObject[1]);
$priceWithoutCurrency = explode(' ', $priceWithCurrency)[1];
$price = intval(str_replace('.', null, $priceWithoutCurrency));
$priceList[] = $price;
}
}
}
$averagePrice = array_sum($priceList) / count($priceList);
return new ServiceResponse(
true,
'Average price calculated successfully.',
200,
intval($averagePrice)
);
}
}