За последние 24 часа нас посетили 84675 программистов и 7667 роботов. Сейчас ищут 2575 программистов ...

помогите с парсером

Тема в разделе "PHP для новичков", создана пользователем ruslanakhatv, 4 янв 2017.

  1. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте помогите. нужно написать парсер который отыщет похожие ссылки из сайта
    примет
    PHP:
    1. (
    2.     [0] => /
    3.     [1] => /kontaktyi/
    4.     [2] => /
    5.     [3] => http://www.informer.ru/cgi-bin/redirect.cgi?id=172_1_1_22_39_1-0&url=http://www.rbc.ru&src_url=usd/usd_dm_cb_711d00_88x61.gif
    6.     [4] => /
    7.     [5] => /zaimy/
    8.     [6] => /katalog/gold/Yuvelirnyye_ukrasheniya/
    9.     [7] => /katalog/watch/1
    10.     [8] => /katalog/gold/antikvariat/
    11.     [9] => /katalog/gold/aksessuary/
    12.     [10] => /archive/
    13.     [11] => /kontaktyi/
    14.     [12] => /action/Vsem_skidki_v_chest_otkrytiya
    15.     [13] => /katalog/read/84
    16.     [14] => /katalog/read/192
    17.     [15] => /katalog/read/watch/85
    18.     [16] => /katalog/read/watch/87
    19.     [17] => /katalog/read/watch/97
    20.     [18] => /katalog/read/watch/111
    21.     [19] => /katalog/read/watch/119
    22.     [20] => /katalog/read/watch/122
    23.     [21] => /katalog/read/watch/123
    24.     [22] => /katalog/read/watch/124
    25.     [23] => /katalog/read/watch/130
    26.     [24] => /katalog/read/watch/134
    27.     [25] => /katalog/read/watch/135
    28.     [26] => /katalog/read/watch/137
    29.     [27] => /katalog/read/watch/141
    30.     [28] => /katalog/read/watch/144
    31.     [29] => /katalog/read/watch/145
    32.     [30] => /katalog/read/watch/147
    33.     [31] => /katalog/read/watch/150
    34.     [32] => /katalog/read/watch/154
    35.     [33] => /katalog/read/watch/155
    36.     [34] => /katalog/read/watch/158
    37.     [35] => /katalog/read/watch/166
    38.     [36] => /katalog/read/watch/124
    39.     [37] => /katalog/read/watch/215
    40.     [38] => /katalog/read/watch/206
    41.     [39] => #
    42.    [40] => #
    43.    [41] => http://vk.com
    44.     [42] => /
    45.     [43] => /zaimy/
    46.     [44] => /katalog/
    47.     [45] => /kontaktyi/
    48. )

    чтоб остались только
    PHP:
    1. (
    2.  
    3.     [6] => /katalog/gold/Yuvelirnyye_ukrasheniya/
    4.     [7] => /katalog/watch/1
    5.     [8] => /katalog/gold/antikvariat/
    6.     [9] => /katalog/gold/aksessuary/
    7.     [13] => /katalog/read/84
    8.     [14] => /katalog/read/192
    9.     [15] => /katalog/read/watch/85
    10.     [16] => /katalog/read/watch/87
    11.     [17] => /katalog/read/watch/97
    12.     [18] => /katalog/read/watch/111
    13.     [19] => /katalog/read/watch/119
    14.     [20] => /katalog/read/watch/122
    15.     [21] => /katalog/read/watch/123
    16.     [22] => /katalog/read/watch/124
    17.     [23] => /katalog/read/watch/130
    18.     [24] => /katalog/read/watch/134
    19.     [25] => /katalog/read/watch/135
    20.     [26] => /katalog/read/watch/137
    21.     [27] => /katalog/read/watch/141
    22.     [28] => /katalog/read/watch/144
    23.     [29] => /katalog/read/watch/145
    24.     [30] => /katalog/read/watch/147
    25.     [31] => /katalog/read/watch/150
    26.     [32] => /katalog/read/watch/154
    27.     [33] => /katalog/read/watch/155
    28.     [34] => /katalog/read/watch/158
    29.     [35] => /katalog/read/watch/166
    30.     [36] => /katalog/read/watch/124
    31.     [37] => /katalog/read/watch/215
    32.     [38] => /katalog/read/watch/206
    33. )
    т.е. нужно парсить так чтоб ссылки ввели к описанию уже товара.
    последовательность директорий могут быть разными
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    substr == '/katalog/' ? o_O
    Не?
    --- Добавлено ---
    В чем сложность?
     
  3. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    не. вместо каталог может быть что угодно т.е.
    /cat/read/1
    /cat/read/2
    /gh/read/..
    /ht/read/..
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    все ссылки которые ведут к товару?
    А что общего у этих ссылок?
     
  5. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    да которые ведут к товару.
    у них обычно начало ссылки одинаковы.
     
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.294
    Симпатии:
    216
    Адрес:
    Default city
    Типа найти одинаковые вхождения в начале у всех строк и убрать их ?
     
  7. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Какое начало ссылки? o_O
    Ищи по началу ссылки раз оно общее для ссылок товаров и не пересекается с другими ссылками.
     
  8. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    нужно из массива найти одинаковые вхождения а лишние убрать
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Дык, скажи по какому шаблону искать.
     
  10. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.294
    Симпатии:
    216
    Адрес:
    Default city
    Напиши функцию посимвольного сравнения, если между текущим и следующим элементом есть N совпадений....
     
  11. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    получаю список ссылок в массиве
    PHP:
    1. [0] => /param1
    2. [1] => /param2/
    3. [2] => /param2/var
    4. [3] => /param2/var2/1
    5. [4] => /param2/1
    6. [5] => /param1
    7. )
    должно остаться
    PHP:
    1.  
    2. [1] => /param2/
    3. [2] => /param2/var
    4. [3] => /param2/var2/1
    5. [4] => /param2/1
    6. )
     
  12. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Чем это не устраивает если у них /param2/ совпадает у всех?)
    --- Добавлено ---
    Подумай над алгоритмом и сам попробуй расписать а мы поможем его реализовать.
     
  13. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    тем что param может быть что угодно. не только katalog или cat,
    нужно чтоб он отсеивал сам без моего вмешательство
    --- Добавлено ---
    парсить буду много сайтов и у всех разное вхождение
     
  14. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Тогда давай логику подключим.

    Нам необходимо по какому то признаку найти ссылки которые ведут к товарам. Парсер должен искать по какому то шаблону ссылки ведущие к товарам.
    Что общего у этих ссылок? Ты пишешь что общее /param2/ но мой вариант поиска по /param2/ тебе не подходит. Где логика?
    --- Добавлено ---
    Может в твоем парсере можно будет указывать для какого сайта как искать, какой шаблон использовать?
    --- Добавлено ---
    Ну зачем удалил ответ свой)
    Я уже начинаю угарать)

    Ответь на вопрос мой
     
  15. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    да вхождения и первое и второе могут быть одинаковы.
    вообще парсер должен работать так
    есть куча сайтов которые надо парсить и естественно структуру DOM каждого изучать и по каждому писать функцию не логично.

    изначально парсер парсит главную страницу и находит ссылки которые введут в каталог.
    в каталоге находит позиции у позиций обычно у всех вхождения одинаковы которые введут в описание
    далее в описание выдергивать инфу которая необходима.

    надеюсь все правильно описал и разъяснил
     
  16. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Где здесь ответ на мой вопрос
    Ты уже выдернул что то и получил массив ссылок. Теперь тебе надо оставить те которые ведут к товарам. Твой парсер не обладает искусственным интеллектом что бы догадаться самому. Тебе надо как то указать по какому шаблону искать.
     
  17. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    шаблон такова что первые вхождения одинаковы ну или вторые. а именно как называется вхождение надо определять по повторам
     
  18. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Чувак, с твоими способностями объяснять и похожу к кодингу, надо во фриланс писать что бы за тебя написали. А воровать инфу не хорошо.
    Ну или первое вхождение ну или второе а если левая рука зачесалась то по третьему вхождению искать. Надо на примерах смотреть что хочешь.
    --- Добавлено ---
    Подсчитай повторение и ищи. На каком этапе сейчас? Ты посчитал повторения? Можешь найти по какому шаблону искать?
     
  19. ruslanakhatv

    ruslanakhatv Новичок

    С нами с:
    4 янв 2017
    Сообщения:
    9
    Симпатии:
    0
    PHP:
    1. (
    2.     [0] => javascript:void(0)
    3.     [1] => about
    4.     [2] => services/sell-watch
    5.     [3] => services/get-credit
    6.     [4] => services/product-assessment
    7.     [5] => javascript:void(0)
    8.     [6] => about
    9.     [7] => novosti
    10.     [8] => otzyvy
    11.     [9] => contacts
    12.     [10] => katalog/watch/
    13.     [11] => katalog/jewelery/
    14.     [12] => katalog/vertu
    15.     [13] => katalog/accessories/
    16.     [14] => services/sell-watch
    17.     [15] => services/get-credit
    18.     [16] => services/product-assessment
    19.     [17] => services/commission-shop
    20.     [18] => services/watch-repair
    21.     [19] => services/insurance
    22.     [20] => services/tsentr-vykupa-brilliantov
    23.     [21] => stati
    24.     [22] => info/watch-catalogue/
    25.     [23] => info/secondary-market
    26.     [24] => info/official-websites
    27.     [25] => info/watch-terms
    28.     [26] => http://lombard-watch.ru/
    29.     [27] => tel:+7 499 530 44 44
    30.     [28] => tel:+7 499 530 44 44
    31.     [29] => katalog/watch/
    32.     [30] => katalog/jewelery/
    33.     [31] => katalog/accessories/
    34.     [32] => contacts
    35.     [33] => katalog/watch/a.-lange-and-sohne/a-lange-and-sohne-lange-1-rose-gold-116998
    36.     [34] => katalog/watch/a.-lange-and-sohne/a.-lange-i-sohne-lange-1-rose-gold-38.5mm
    37.     [35] => katalog/watch/a.-lange-and-sohne/a.lange-and-sohne-lange-1-116519
    38.     [36] => katalog/watch/arnold-and-son/arnold-i-son-royal-collection-te8-tourbillon
    39.     [37] => katalog/watch/arnold-and-son/arnold-and-son-tbr-true-beat-retrograde-steel-116802
    40.     [38] => katalog/watch/audemars-piguet/audemars-piguet-jules-chronograph-113299-25220
    41.     [39] => katalog/watch/audemars-piguet/audemars-piguet-millenary-automatic-ladies
    42.     [40] => katalog/watch/audemars-piguet/audemars-piguet-millenary-automatic-lady-small-rose-gold
    43.     [41] => katalog/watch/audemars-piguet/audemars-piguet-millenary-chronograph
    44.     [42] => katalog/watch/audemars-piguet/audemars-piguet-millenary-quantieme-perpetuel-116680
    45.     [43] => katalog/watch/audemars-piguet/audemars-piguet-royal-oak-offshore-scuba-diver-boutique-edition-116955
    46.     [44] => katalog/watch/blancpain/blancpain-fifty-fathoms-bathyscaphe-automatic-113640-25236
    47.     [45] => katalog/watch/blancpain/blancpain-fifty-fathoms-bathyscaphe-automatic-116431
    48.     [46] => katalog/watch/blancpain/blancpain-l-evolution-reveil-gmt
    49.     [47] => katalog/watch/blancpain/blancpain-leman-reveil-gmt-116862
    50.     [48] => katalog/watch/blancpain/blancpain-leman-ultra-slim-automatic-116934
    51.     [49] => katalog/watch/blancpain/kopiya-blancpain-villeret-chronograph-rose-gold-36505
    52.     [50] => katalog/watch/blu/blu-atoll-91648
    53.     [51] => katalog/watch/breguet/breguet-classique-alarm-le-reveil-du-tsar-82147
    54.     [52] => katalog/watch/breguet/breguet-classique-alarm-le-reveil-du-tsar-36707
    55.     [53] => katalog/watch/breguet/kopiya-breguet-classique-power-reserve-36473
    56.     [54] => katalog/watch/breguet/breguet-classique-perpetual-calendar-yellow-gold-116687
    57.     [55] => katalog/watch/breguet/breguet-classique-power-reserve-116869
    58.     [56] => katalog/watch/breguet/breguet-heritage-chronograph-platinum-bracelet-116349
    59.     [57] => katalog/watch/breguet/breguet-marine-automatic-big-date
    60.     [58] => katalog/watch/breguet/breguet-marine-chronograph-rose-gold-36693
    61.     [59] => katalog/watch/breguet/kopiya-breguet-marine-royale-rose-gold-36495
    62.     [60] => katalog/watch/breguet/breguet-tradition-gmt-manual-wind-116626
    63.     [61] => katalog/watch/breitling/breitling-montbrillant-legende-steel-and-gold-hands
    64.     [62] => katalog/watch/cartier/cartier-tank-americaine-midsize-white-gold-117007
    65.     [63] => katalog/watch/cartier/cartier-tank-american-automatic-chrono-xl-116456
    66.     [64] => katalog/watch/cartier/cartier-tank-francaise-yellow-gold-and-steel-116959
    67.     [65] => katalog/watch/chanel/chanel-j12-chromatic-automatic-unisex-diamonds-custom
    68.     [66] => katalog/watch/chanel/chanel-j12-custom-baguette-diamonds-and-ruby
    69.     [67] => katalog/watch/chanel/chanel-j12-quartz-38-mm-ceramic-and-rose-gold-117036
    70.     [68] => katalog/watch/chaumet/chaumet-liens-white-gold-diamonds-116947
    71.     [69] => katalog/watch/chopard/chopard-happy-sport-happy-hearts-117029
    72.     [70] => katalog/watch/chopard/chopard-imperiale-quartz-36mm-ladies
    73.     [71] => katalog/watch/chopard/chopard-imperiale-quartz-36mm-ladies-36675
    74.     [72] => katalog/watch/chopard/chopard-l.u.c.-lunar-one-perpetual-calendar
    75.     [73] => katalog/watch/chopard/chopard-l.u.c.-xp-tonneau-white-gold
    76.     [74] => katalog/watch/chopard/chopard-mille-miglia-chronograph-39-mm-steel
    77.     [75] => katalog/watch/chopard/chopard-mille-miglia-gmt-chronograph-speed-black-2-limited-edition
    78.     [76] => katalog/watch/chopard/chopard-mille-miglia-limited-edition-rose-gold
    79.     [77] => katalog/watch/chopard/chopard-two-o-ten-diamond-chronograph-107914-24987
    80.     [78] => katalog/watch/concord/concord-c1-world-timer-48411
    81.     [79] => katalog/watch/corum/corum-admirals-cup-deep-hull-48
    82.     [80] => katalog/watch/corum/corum-admirals-cup-competition-116610
    83.     [81] => katalog/watch/cvstos/cvstos-challenge-chrono-gt-limited-edition-116914
    84.     [82] => katalog/watch/de-grisogono/de-grisogono-be-eight-ladies-116577
    85.     [83] => katalog/watch/de-grisogono/de-grisogono-novantatre-n05
    86.     [84] => katalog/watch/de-grisogono/de-grisogono-uno-steel-and-rose-gold-numerals
    87.     [85] => katalog/watch/dewitt/dewitt-academia-seconde-retrograde-116762
    88.     [86] => katalog/watch/dewitt/dewitt-ladies-golden-afternoon
    89.     [87] => katalog/watch/franck-muller/franck-muller-chronograph-white-gold-116859
    90.     [88] => katalog/watch/franck-muller/franck-muller-cintree-curvex-classic-rose-gold-automatic-116484
    91.     [89] => katalog/watch/glashutte/glashutte-original-senator-116521
    92.     [90] => katalog/watch/glashutte/glashutte-original-senator-complete-calendar-107008-24952
    93.     [91] => katalog/watch/h.moser-and-cie/h.-moser-and-cie-collection-moser-perpetual-1-golden-edition-116565
    94.     [92] => katalog/watch/h.moser-and-cie/h.-moser-and-cie.-endeavour-small-seconds-116524
    95.     [93] => katalog/watch/hd3/hd3-slyde-by-jorg-hysek-111755
    96.     [94] => katalog/watch/hd3/hd3-slyde-by-jorg-hysek-116902
    97.     [95] => katalog/watch/hermes/hermes-dressage-yellow-gold-mother-of-pearl-116883
    98.     [96] => katalog/watch/hublot/hublot-big-bang-king-black-magic-diver-117049
    99.     [97] => katalog/watch/hublot/hublot-big-bang-king-diver-48-rose-gold-36641
    100.     [98] => katalog/watch/hublot/hublot-big-bang-rose-gold-ceramic-116941
    101.     [99] => katalog/watch/hublot/hublot-big-bang-uefa-83610
    102.     [100] => katalog/watch/hublot/hublot-classic-fusion-zirconium-ceramic-116808
    103.     [101] => katalog/watch/iwc/iwc-big-pilot’s-alexei-nemov-limited-edition
    104.     [102] => katalog/watch/iwc/iwc-portuguese-hand-wound-rose-gold-boutique-edition-116971
    105.     [103] => katalog/watch/iwc/iwc-portuguese-minute-repeater-manual-limited-edition
    106.     [104] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-atmos-classique-phases-de-lune-116943
    107.     [105] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-atmos-vendome-116459
    108.     [106] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-master-compressor-chronograph-2-116427
    109.     [107] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-master-compressor-diving-gmt-117047
    110.     [108] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-master-compressor-world-alarm-tides-of-time-116867
    111.     [109] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-master-grand-reveil-perpetual-calendar-steel-116981
    112.     [110] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-reverso-gran-sport-night-i-day-diamonds
    113.     [111] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-reverso-manual-116495
    114.     [112] => katalog/watch/jaeger-lecoultre/jaeger-lecoultre-reverso-squadra-world-chronograph-116803
    115.     [113] => katalog/watch/jean-richard/jeanrichard-tv-screen-double-retrograde-91647
    116.     [114] => katalog/watch/lepee/lepee-arachnophobia-by-mb-and-f-101459
    117.     [115] => katalog/watch/maurice-lacroix/maurice-lacroix-masterpiece-lune-retrograde-112941-25215
    118.     [116] => katalog/watch/maurice-lacroix/maurice-lacroix-pontos-rectangulaire-date-116754
    119.     [117] => katalog/watch/omega/omega-seamaster-300m-electric-blue-116983
    120.     [118] => katalog/watch/panerai/panerai-luminor-1950-power-reserve
    121.     [119] => katalog/watch/parmigiani/parmigiani-fleurier-forma-xl-hebdomadaire-8-day-power-reserve-90626
    122.     [120] => katalog/watch/parmigiani/parmigiani-fleurier-ionica-8-day-platinum-116882
    123.     [121] => katalog/watch/parmigiani/parmigiani-kalpa-116486
    124.     [122] => katalog/watch/patek-philippe/patek-philippe-calatrava-automatic-white-gold
    125.     [123] => katalog/watch/patek-philippe/patek-philippe-calatrava-white-gold-116691
    126.     [124] => katalog/watch/patek-philippe/patek-philippe-vintage-ellipse-116547
    127.     [125] => katalog/watch/pierre-kunz/kopiya-pierre-kunz-retrograde-seconds-36491
    128.     [126] => katalog/watch/pierre-kunz/pierre-kunz-spirit-of-challenge-48194
    129.  
    130. )
    вот еще один массив нужно исключить не повторяющиеся ссылки
    --- Добавлено ---
    а инфа только для сравнения
    --- Добавлено ---
    как раз таки вот это не знаю как в коде написать. просчитать повторение и найти наиболее повторяющиеся оставить
     
  20. Sandulf

    Sandulf Новичок

    С нами с:
    11 дек 2016
    Сообщения:
    8
    Симпатии:
    1
    Компьютер не умеет пользоваться интуицией, даже примитивно. Хотя, у google есть разработки, которые отдаленно можно назвать компьютерной интуицией, но они все еще очень далеки от человеческой, при этом требуют очень много ресурсов. Тебе в любом случае надо находить какие-то общие признаки нужных тебе ссылок, которые поддаются логике, в достаточном количестве. Если ты парсишь много разных сайтов - скорее всего под одну гребенку сможешь причесать не более 60-80% сайтов. Под остальные все-таки придется делать отдельные куски кода. Может, конечно, и не придется, но это будет скорее везение.

    Под тот массив, который ты кинул, предлагаю такие общие признаки:
    1. минимум 2 слеша в ссылке
    2. нет слеша в конце
    3. текст до первого слеша один для всех ссылок
    4. ссылок на товары на странице больше, чем каких-либо других

    Под такой набор признаков вот тебе конкретный пример:
    PHP:
    1. $input = [ // твой массив ссылок, не буду захламлять им код
    2. ];
    3.  
    4. $calc = [];
    5. $output = [];
    6. $max = 0;
    7. $maxKey = null;
    8.  
    9. foreach($input as $url){
    10.     $els = explode('/',$url);
    11.  
    12.     // пропускаем ссылки, у которых меньше 2 слеша
    13.     if(count($els)<3)
    14.         continue;
    15.  
    16.     // пропускаем ссылки, у которых слеш в конце
    17.     if(substr($url,strlen($url)-1,1) === '/')
    18.         continue;
    19.  
    20.     // записываем в наш массив в формате первый_элемент_uri => [uri1, uri2, ... uriN]
    21.     // и записываем количество ссылок с таким первым элементом
    22.     if(!isset($calc[$els[0]])){
    23.         $calc[$els[0]] = 0;
    24.         $output[$els[0]] = [];
    25.     }
    26.     $calc[$els[0]]++;
    27.     $output[$els[0]][] = $url;
    28.  
    29.     // сразу проверим, если это самая большая сумма - запомним
    30.     if($maxKey !== $els[0] AND $max < $calc[$els[0]]){
    31.         $maxKey = $els[0];
    32.         $max = $calc[$els[0]];
    33.     }
    34. }
    35.  
    36. // и посмотрим на результат
    37. print_r($output[$maxKey]);