slo_nik
@slo_nik

Как увеличить скорость парсинга?

Добрый день.
Сайт разработан на yii2.
Есть консольные скрипты, которые парсят данные(объявления) с двух других сайтов(продажа авто).
Данные приходят в xml.

От первого сайта на каждое объявление свой xml. Содержит контактные данные о рекламодателе и данные об автомобиле.

От второго сайта все объявления одного рекламодателя содержатся в одном большом xml. Я при помощи скрипта разбиваю один xml на несколько, в каждом отдельном находится контактная информацию о рекламодателе и об авто.
Получается, что, в конечном итоге, xml по структуре одинаковые, как для первого, так и для второго сайта.

Пример xml первого сайта
<?xml version="1.0" encoding="utf-8"?>
<cars>
<source>Zdrojem dat je databáze fy TEAS s.r.o.</source>
<date>18.3.2019</date>
<error is_error="0"/>
	<car>
		<id>447673</id>
		<bid>E43809</bid>
			<inzerent>
				<id>47</id>
				<nazev>AUTOCENTRUM JAN ŠMUCLER s.r.o.</nazev>
				<firma>provozovny Horšovský Týn, Plzeň</firma>
				<jmeno>Prodej vozů SEAT, ŠKODA, HYUNDAI a HONDA</jmeno>
				<ulice>J. Jindřicha 273</ulice>
				<mesto>Horšovský Týn</mesto>
				<tel>379 412 233,237</tel>
				<email>ojetevozy.htyn@smucler.cz</email>
			</inzerent>
		<inserted>2019-03-12T19:28:23.000+01:00		</inserted>		<edited>2019-03-12T19:28:23.000+01:00		</edited>		<del>0</del>
		<category>Osobní</category>
		<sport_car>0</sport_car>
		<producer_text>Škoda</producer_text>
		<model_text>Octavia</model_text>
		<model_supplement>2,0 TDi Style Plus</model_supplement>
		<specification>TDi Style Plus</specification>
		<gen_equip/>
		<content_dec>2.0</content_dec>
		<content_cm>1968</content_cm>
		<engine_spec/>
		<color>černá metalíza</color>
		<state>CZ</state>
		<gear>Manuální</gear>
		<gearing/>
		<constr>liftback</constr>
		<fuel>Nafta</fuel>
		<constr_year>2018</constr_year>
		<model_year>0</model_year>
		<to_operation>2018-06-01</to_operation>
		<km>21144</km>
		<seats>5</seats>
		<kw>110</kw>
		<stk>2022-06-01</stk>
		<me>2022-06-01</me>
		<doors_number>5</doors_number>
		<speeds_number>6</speeds_number>
		<service_book>1</service_book>
		<nocrash>0</nocrash>
		<vat_expel_flag>1</vat_expel_flag>
		<vat_expel_text>Cena s DPH</vat_expel_text>
		<new_flag>0</new_flag>
		<sales_price>519800.00</sales_price>
		<burza_price>0.00</burza_price>
		<new_car_price>0.00</new_car_price>
		<payment>0</payment>
		<payment_count>0</payment_count>
		<repayment>0</repayment>
		<extras>			<extra>6 rychlostních stupňů</extra>
			<extra>ABS</extra>
			<extra>airbag kolenní</extra>
			<extra>airbag řidiče a spolujezdce</extra>
			<extra>airbagy boční</extra>
			<extra>aut. aktivace výstražných světlometů</extra>
			<extra>aut. klimatizace</extra>
			<extra>bezklíčové startování a odemykání</extra>
			<extra>bluetooth</extra>
			<extra>centrál dálkový</extra>
			<extra>deaktivace airbagu spolujezdce</extra>
			<extra>dekor interiéru (dřevo</extra>
			<extra>hliník atp.)</extra>
		</extras>		<remarks>			<remark>První majitel</remark>
			<remark>Leasing možný</remark>
			<remark>Spotřebitelský úvěr možný</remark>
			<remark>Koupeno v ČR</remark>
			<remark>1.majitel. Odpočet DPH možný. Servisní knížka. Možný protiúčet. CEBIA 5*. Prodloužená tovární záruka 5 let/ 100 000km.Výhodné financování a pojištění u VWFS.Vozidlo na pobočce v Plzni. Info na tel.lince 371 005 252</remark>
			<remark>mobil: 730 571 232</remark>
			<remark>602 186 548.</remark>
		</remarks>		<etc>velmi dobrý</etc>
		<prvni_majitel>1</prvni_majitel>
		<owner>1</owner>
		<consumption>4,4</consumption>
		<vin>TMBAJ7NE3J0358077</vin>
		<leasing_pos>1</leasing_pos>
		<su_pos>1</su_pos>
		<currency>CZK</currency>
		<photos>
			<photo order="1" inserted="2019-03-12T19:28:23.000+01:00" size="135141">http://www.autocaris.cz/car_foto/47/447673/1O25238.jpg</photo>
			<photo order="2" inserted="2019-03-12T19:28:23.000+01:00" size="128191">http://www.autocaris.cz/car_foto/47/447673/2O25238.jpg</photo>
			<photo order="3" inserted="2019-03-12T19:28:23.000+01:00" size="144067">http://www.autocaris.cz/car_foto/47/447673/3O25238.jpg</photo>
			<photo order="4" inserted="2019-03-12T19:28:23.000+01:00" size="127015">http://www.autocaris.cz/car_foto/47/447673/4O25238.jpg</photo>
		</photos>
		<tech_photos>
		</tech_photos>
		<Pozn_Vyv/>
	</car>
</cars>

Пример xml второго сайта после разбивки на несколько
<?xml version="1.0" encoding="utf-8"?>
<cars>
	<car>
		<inzerent>
			<id>263</id>
			<subject/>
			<nazev>APAUTO</nazev>
			<firma>A.P.Auto</firma>
			<prijmeni/>
			<ulice>Českobrodská 345</ulice>
			<mesto>PRAHA 9</mesto>
			<psc>190 00</psc>
			<kraj>Kraj Praha</kraj>
			<tel>+420 272 700 970</tel>
			<mobil>776 315 800,776 315 900</mobil>
			<fax>+420 272 700 970</fax>
			<mail>info@apauto.cz</mail>
			<ico/>
		</inzerent>
		<id>A922/19</id>
		<category>Osobní</category>
		<producer_text>Chrysler</producer_text>
		<model_text>Sebring</model_text>
		<gear/>
		<fuel>inz_benzin</fuel>
		<constr_year>2006</constr_year>
		<constr>kabriolet</constr>
		<km>73000</km>
		<kw>149</kw>
		<sales_price>109000</sales_price>
		<remarks>
			test
		</remarks>
		<extras>
			<extra>2x airbag</extra>
			<extra>ABS</extra>
			<extra>aut. převodovka</extra>
			<extra>autorádio</extra>
			<extra>CD přehrávač</extra>
			<extra>centrál dálkový</extra>
			<extra>el. okna</extra>
			<extra>el. zrcátka</extra>
			<extra>imobilizér</extra>
			<extra>litá kola</extra>
			<extra>multifunkční volant</extra>
			<extra>nastavitelný volant</extra>
			<extra>posilovač řízení</extra>
			<extra>shrnovací střecha</extra>
			<extra>USB</extra>
			<extra/>
		</extras>
		<photos>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_1.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_2.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_3.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_4.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_5.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_6.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_7.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_8.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_9.JPG</photo>
			<photo>http://www.autosoft.cz/apauto/obr/A922_19_10.JPG</photo>
		</photos>
	</car>
</cars>



Теперь, когда я запускаю скрипт, который читает xml и записывает данные в базу данных, для первого сайта за приблизительно 50 минут можно обработать 400 xml. Но вот для второго сайта, за такое же время, только 140 xml.

Проверил через пинг время отклика от первого сайта и от второго. Разница приблизительно в два раза.
Первый сайт - 64 bytes from 26.26.broadband16.iol.cz (90.183.26.26): icmp_seq=1 ttl=54 time=62.3 ms
Второй сайт - 64 bytes from 59.194.forpsi.net (81.2.194.59): icmp_seq=8 ttl=119 time=36.4 ms

Я так понимаю, что это из-за загрузки изображений.

Почему со второго сайта так медленно идёт парсинг, а с первого быстрей?
Как можно увеличить скорость?
Что в данном случае может влиять на скорость чтения xml?

P.S. Сначала для второго сайта подготавливаю xml, а после этого записываю данные в базу. Получается, что время на разбивку одного большого на несколько маленьких xml не играет роли.
  • Вопрос задан
  • 348 просмотров
Пригласить эксперта
Ответы на вопрос 2
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Парсинг очень легко паралелится, поищите статьи на хабре про pcntl, shmop
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Потому что железо и нагрузки у них разные, да и объемы данных.
Попробуй добавить заголовок "Accept-Encoding: gzip" - возможно доступна сжатая передача данных.
Распаковка результата:
$response = gzinflate(substr($response, 10, -8) );

Я так понимаю, что это из-за загрузки изображений.

если парсинг xml не regexp'ом, а через simplexml, то лучше задать options - LIBXML_COMPACT | LIBXML_NONET | LIBXML_NOCDATA
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы