:::: MENU ::::

WebDevExp

Meine Erfahrungen in der Webentwicklerwelt

Klasse zum Crawlen von Ebayauktionen (Ebay-Api)

php

Klasse zum Crawlen von Ebayauktionen (Ebay-Api)

Wie schonmal erwähnt, habe ich mir eine Applikation gebaut, um nach Ebayauktionen in meiner Nähe zu suchen, mittlerweile ist aus dem Spagetticode eine richtige Klasse geworden. Und weil Crawlen nur bedingt geeignet ist und auch nicht ganz so legal, nutze ich nun die Ebay-Finding-Api. Hier biete ich den kompletten Quelltext dieser an, für Verbesserungvorschläge bin ich jederzeit offen. Bitte nicht zu sehr auf das Englisch in den Kommentaren achten, es war schon recht spät, als ich diese verfasst habe.

 "10614",
		"Computer" => "160",
		"Garten" => "2032",
		"Heimwerker" => "3187",
		"Moebel" => "11700",
		"Spielzeug" => "220",
		"TV" => "293",
		"Fahrzeuge" => "9800",
		"Fahrzeugteile" => "131090",
		"Buero" => "9815",
		"Tierwelt" => "8440",
		"Buecher" => "267",
	);

	const ENDPOINT = 'http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsAdvanced&SERVICE-VERSION=1.0.0';  // URL to call
	const APPID = [YOUR-APP-ID];
	const SITE = 'EBAY-DE';
	const TIMEZONE = 'Europe/Berlin';

    /**
     * the preg_matched results
     * @var array
     */
	private $results = array();

	/**
	 * url for apicall
	 * @var string
	 */
	private $apicall;

	/**
	 * filters for search result
	 * @var array
	 */
	private $filters = array(
	  array(
		'name' => 'LocalPickupOnly',
		'value' => 'true',
	  ),
	  array(
		'name' => 'LocalSearchOnly',
		'value' => 'true',
	  )
	);

    /**
     * construcor of ebay crawler class, paramters
     * will be injected in apicall
     * @param int $itemsPerCat
     * @param int $radius
     * @param string $zip
     * @param float $maxcost
     * @return Ebay
     */
	public function __construct($itemsPerCat=20, $radius=25, $zip=63667, $maxcost=1){
		date_default_timezone_set(self::TIMEZONE);
		$this->apicall = self::ENDPOINT.'&GLOBAL-ID='.self::SITE.'&SECURITY-APPNAME='.self::APPID;
		$this->apicall .= '&buyerPostalCode='.$zip;
		$this->apicall .= '&paginationInput.entriesPerPage='.$itemsPerCat;
		$this->filters[] = array(
			'name' => 'MaxPrice',
			'value' => $maxcost,
			'paramName' => 'Currency',
			'paramValue' => 'EUR'
		);
		$this->filters[] = array(
			'name' => 'MaxDistance',
			'value' => $radius,
		);
		$this->addFiltersToCall();
 	}

    /**
     * sorts and returns the complete results
     * @return array
     */
	public function getResults(){
		usort($this->results, array($this,'sortit'));
		return $this->results;
	}

    /**
     * @param string $cat
     * @return void
     */
	public function loadCat($cat){
		$call = $this->apicall.'&categoryId='.self::$cats[$cat];
		$response = simplexml_load_file($call);
		if($response->ack != 'Success'){
			echo "Error in apicall while getting $cat: $call";
			print_r($response);
			exit();
		}
		$result = $response->searchResult;
		if($result['count'] == 0){
			return; //no items found
		}

		foreach($result->item as $item){
			//get seconds for sorting, then add item itself
			$end = strtotime($item->listingInfo->endTime);
			$str = (date("Y-m-d") == date("Y-m-d",$end)) ? "H:i:s" : "d.m. H:i:s";
			$item->listingInfo->endTime = date($str, $end);
			if(strpos($item->location, ',')!==false){
				$item->location = substr($item->location, 0, strrpos($item->location, ','));
			}
			$this->results[] = array(
				'seconds' => $end-time(),
				'data' => $item
			);
		}
	}

	/**
	 * adds the filters to the apicall
	 * @return void
	 */
	private function addFiltersToCall(){
		$string = '';
		foreach($this->filters as $i => $itemFilter){
			foreach($itemFilter as $key => $value){
				if(is_array($value) && count($value) > 0){
					foreach($value as $j => $content){
						$string .= "&itemFilter($i).$key($j)=$content";
					}
				}
				else{
					if($value != ''){
						$string .= "&itemFilter($i).$key=$value";
					}
				}
			}
		}
		$this->apicall .= $string;
	}

    /**
     * sort function for usort
     * @param array $a
     * @param array $b
     * @return int
     */
	private function sortit($a,$b){
		return ($a["seconds"] < $b["seconds"]) ? -1 : 1;
	}
}

6 Comments

  1. Ralf

    Hallo,
    bin auch gerade dabei ne lokale eBay-Suche zu bauen, bekomme aber keine gefilterten Ergebnisse mit ‚LocalPickupOnly‘ Klappt das bei Dir?
    Danke im voraus…

    Antworten
  2. Ralf

    Ich bekomme schon ne Antwort, bloss die Filterung klappt nicht, er gibt mir auch Artikel raus, die verschickt werden sollen (also kein FreePickup) 🙁

    Antworten
  3. Ralf

    da wäre z.B.
    http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsAdvanced&SERVICE-VERSION=1.0.0&GLOBAL-ID=EBAY-DE&SECURITY-APPNAME=appid&buyerPostalCode=59457&paginationInput.entriesPerPage=20&itemFilter(0).name=MaxDistance&itemFilter(0).value=25&itemFilter(1).name=LocalPickupOnly&itemFilter(1).value=true&categoryId=12081&sortOrder=EndTimeSoonest
    Der gibt zwar lokale Werte zurück, aber eben bunt gemischt und nicht wie ich erwarten würde nur Datensätze mit dem Attribut FreePickup.

    Antworten
  4. Michael

    Ich denke die Variable ist ziemlich bescheiden benannt, es werden Artikel ausgegeben, bei denen die Selbstabholung möglich ist, auch die, wo sie zusätzlich möglich ist. Du müsstest die Versandsachen evtl. noch über nen anderen Filter ausschließen. Bei mir ergibt die Suche auch alles, was auch so gewollt ist, über den Distanzfilter sorge ich dafür, dass es nur Dinge in meiner Umgebung sind, der Rest ist doch eigentlich egal, oder nicht?

    Antworten

Leave a comment

Loading Facebook Comments ...