21

Re: Парсер телефонів OLX

Nachtjagdgeschwader написав:
VTrim написав:

Ось і весь "захист" :)

<?php

$url = 'https://www.olx.ua/obyavlenie/elektropila-makita-uc4051a-IDtMiOG.html';

$cookie_path = $_SERVER['DOCUMENT_ROOT'].'/cookie.dat';

preg_match('|-ID(.*).html|', $url, $id);

$olx = curl_init($url);
curl_setopt($olx, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($olx, CURLOPT_RETURNTRANSFER, true);
curl_setopt($olx, CURLOPT_HEADER, 1);
curl_setopt($olx, CURLOPT_COOKIEFILE, $cookie_path);
curl_setopt($olx, CURLOPT_COOKIEJAR, $cookie_path);
$result = curl_exec($olx);
curl_close($olx);

preg_match("|phoneToken = '(.*)';|", $result, $token);

$olx_number = curl_init('https://www.olx.ua/ajax/misc/contact/phone/' . $id[1] . '/?pt=' . $token[1]);
    curl_setopt($olx_number, CURLOPT_HTTPHEADER, [
            'Host: www.olx.ua',
            'Accept: */*',
            'Accept-Language: uk,ru;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding: gzip, deflate, br',
            'Connection: keep-alive',
            'X-Requested-With: XMLHttpRequest'
        ]);
        curl_setopt($olx_number, CURLOPT_REFERER, $url);
        curl_setopt($olx_number, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($olx_number, CURLOPT_COOKIEFILE, $cookie_path);
        curl_setopt($olx_number, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($olx_number, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($olx_number);
        curl_close($olx_number);
        
        $json = json_decode($result);
        echo $json->value;

Переклад мовою Python 3. Можливо, так комусь буде зручніше:

import re
import pycurl
from io import BytesIO
from bs4 import BeautifulSoup
import json

url="https://www.olx.ua/obyavlenie/elektropila-makita-uc4051a-IDtMiOG.html"
b = BytesIO()
c = pycurl.Curl()
cookie_path = 'cookie.dat'
ID = re.findall("-ID(.*?)\.html", url)[0]
c.setopt(pycurl.URL, url)
c.setopt(pycurl.SSL_VERIFYPEER, False)
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.HEADER, 1)
c.setopt(pycurl.COOKIEFILE, cookie_path)
c.setopt(pycurl.COOKIEJAR, cookie_path)
c.perform()
c.close()
data = b.getvalue()
soup = BeautifulSoup(data, "html.parser")
phoneToken = re.findall("var phoneToken = '(.*?)'", soup.text)[0]
phone_url='https://www.olx.ua/ajax/misc/contact/phone/{0}/?pt={1}'.format(ID, phoneToken)
bb = BytesIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, phone_url)
c.setopt(pycurl.HTTPHEADER, [
            'Host: www.olx.ua',
            'Accept: */*',
            'Accept-Language: uk,ru;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding: gzip, deflate, br',
            'Connection: keep-alive',
            'X-Requested-With: XMLHttpRequest'
        ])
c.setopt(pycurl.WRITEFUNCTION, bb.write)
c.setopt(pycurl.REFERER, url)
c.setopt(pycurl.COOKIEFILE, cookie_path)
c.setopt(pycurl.SSL_VERIFYPEER, False)
c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36')
c.perform()
c.close()
data = bb.getvalue()
try:
    json_data = json.loads(data)
    phoneNumber=json_data['value']
except:
    phoneNumber ='Перевірте номер за посиланням оголошення'
print(phoneNumber)

Перекладено на PHP OOP з GuzzleHttp.

composer require guzzlehttp/guzzle:~6.0

<?php
require_once(__DIR__ . '\vendor\autoload.php');

$url = '/obyavlenie/elektropila-makita-uc4051a-IDtMiOG.html';
$phoneUrl = '/ajax/misc/contact/phone/{ID}?pt={TOKEN}';

preg_match('|-ID(.*).html|', $url, $matchId);
$id = end($matchId);

$jar = new \GuzzleHttp\Cookie\CookieJar;
$client = new GuzzleHttp\Client([
    'base_uri' => 'https://www.olx.ua/',
    'cookies' => $jar,
    'headers' => [
        'user-agent' => 'Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405',
    ]
]);

$response = $client->request('GET', $url);
preg_match("|phoneToken = '(.*)';|", $response->getBody()->getContents(), $matchToken);
$token = end($matchToken);

$phoneUrl = str_replace(['{ID}', '{TOKEN}'], [$id, $token], $phoneUrl);
$response = $client->request('GET', $phoneUrl);

echo(json_decode($response->getBody()->getContents())->value);
?>
Подякували: 0xDADA11C7, ostap34PHP, free_net, /KIT\4

22

Re: Парсер телефонів OLX

Вітаю, шановні.
Спробував код на пітоні - повертає нулі. Вони знов щось змінили в захисті?
Хто в темі, допоможіть, будь ласка. Вже другий день б'юся з цим телехфоном((

23

Re: Парсер телефонів OLX

AndK написав:

Вітаю, шановні.
Спробував код на пітоні - повертає нулі. Вони знов щось змінили в захисті?
Хто в темі, допоможіть, будь ласка. Вже другий день б'юся з цим телехфоном((

Ключ - поле Referer. Якщо цікаво - є вже готовий парсер, за певну і доволі скромну винагороду можу поділитись.

24

Re: Парсер телефонів OLX

і що ж то за скромна винагорода?

[x|x<-[2..],all(>0)[x`mod`y|y<-[2..x-1]]]

25

Re: Парсер телефонів OLX

/KIT\ написав:

і що ж то за скромна винагорода?

Якщо дійсно цікаво - напишіть у пм, все розкажу