CoderCastrov logo
CoderCastrov
Парсинг веб-страниц

Парсинг веб-страниц с использованием scrapy+cloud

Парсинг веб-страниц с использованием scrapy+cloud
просмотров
4 мин чтение
#Парсинг веб-страниц
Table Of Content

    Ну, дело в том, что многие сайты не очень-то хотят, чтобы их контент парсили. (Контент - король монетизации!) Поэтому, чтобы собрать большое количество данных с определенного веб-сайта, нужно очень осторожно обращаться к нему, чтобы не быть замеченным.

    Самый распространенный способ обойти это - использование прокси-сервера, куда вы отправляете свой запрос, а затем он распределяется по десяткам тысяч машин с разными IP-адресами, чтобы вести себя как настоящий пользователь, посещающий сайт.

    Так что, после того как была исследована основная реализация на Java, которая потребует от меня управления развертыванием, настройки прокси (возможно, дополнительная оплата помимо экземпляра GCP), я хочу узнать, есть ли решение, которое сможет уменьшить мои головные боли по поддержке инфраструктуры парсинга веб-страниц. Еще одна проблема программирования на Java заключается в том, что мне нужно перестраивать и перезапускать код каждый раз, когда я настраиваю извлечение значений из HTML-тегов, что, конечно, можно сделать настраиваемым, но в самом начале более простой способ найти нужное место для извлечения значения сэкономит много хлопот.

    Тогда я начал изучать скриптовые языки, и, очевидно, у Python есть некоторые крутые штуки. Я нашел библиотеку на Python под названием Scrapy, по количеству звезд на GitHub она довольно популярна: https://github.com/scrapy/scrapy. Документация очень хорошо написана, так что веселитесь.

    Чтобы пойти еще дальше, да, у нас теперь есть библиотека на Python, которая позволяет мне легче и быстрее отлаживать HTML-теги, а что насчет развертывания? Тогда я нашел этот веб-сайт под названием ScrapingHub, который предоставляет возможность парсинга в облаке, и у них даже есть панель управления! Очень рад попробовать! Мое внимание привлек продукт под названием AutoExtract, который предоставляет функцию для парсинга статей или товаров. Пробная версия бесплатна на 14 дней с 10 тысячами запросов, неплохо поиграться. Платная версия будет стоить $60 в месяц.

    Давайте попробуем снова на примере страницы Amazon, которую я использовал в предыдущей статье:

    curl --verbose \--user '{ваш_секрет}':'' \--header 'Content-Type: application/json' \--data '[{"url": "https://www.amazon.com/WALI-Premium-Adjustable-Capacity-GSDM003/dp/B07VRB86RQ/ref=sr_1_4?keywords=monitor&qid=1571888481&s=office-products&sr=1-4", "pageType": "product"}]' \https://autoextract.scrapinghub.com/v1/extract

    Вот результат:

    [
      {
        "query": {
          "id": "1571950325857-bd6d16e201ad25ac",
          "domain": "amazon.com",
          "userQuery": {
            "url": "[https://www.amazon.com/WALI-Premium-Adjustable-Capacity-GSDM003/dp/B07VRB86RQ/ref=sr_1_4?keywords=monitor&qid=1571888481&s=office-products&sr=1-4](https://www.amazon.com/WALI-Premium-Adjustable-Capacity-GSDM003/dp/B07VRB86RQ/ref=sr_1_4?keywords=monitor&qid=1571888481&s=office-products&sr=1-4)",
            "pageType": "product"
          }
        },
        "product": {
          "name": "WALI Premium Triple LCD Monitor Desk Mount Fully Adjustable Gas Spring Stand for Display Up to 27 Inch, 15.4lbs Capacity (GSDM003), Black",
          "description": "This fits your .\nMake sure this fits by entering your model number.\nCompatibility: fits LCD, LED flat screen TV and monitor up to 27\". Support up to 15.4 lbs. Vesa compatible 75 x 75mm or 100 x 100 mm. Two stage locking system is compatible with 3.3” c-clamp and 3.1” grommet base.\nFully adjustable: the gas spring stand can tilt +45°/-45°, swivel +90°/-90°, and rotate 360°,Max height is up to 29\", and max extension is up to 24.5\".\nDouble benefits: double efficiency and productivity to make working or relaxing that much more comfortable.\nSturdy construction: high-grade material c-clamp, grommet base and VESA plate ensures a strong and stable connection with your desk and monitor screen.\nPackage includes: 1 x WALI triple monitor gas spring desk mount, 1 x mounting hardware kit, 1 x User manual, 10 Year protection",
          "mainImage": "[https://images-na.ssl-images-amazon.com/images/I/616O2NOnXnL._AC_SX679_.jpg](https://images-na.ssl-images-amazon.com/images/I/616O2NOnXnL._AC_SX679_.jpg)",
          "images": [
            "[https://images-na.ssl-images-amazon.com/images/I/616O2NOnXnL._AC_SX679_.jpg](https://images-na.ssl-images-amazon.com/images/I/616O2NOnXnL._AC_SX679_.jpg)",
            "[https://m.media-amazon.com/images/S/aplus-media/vc/f45f2d24-3d13-430e-b5f1-bb9d799216ca.__CR0,0,600,800_PT0_SX300_V1___.jpg](https://m.media-amazon.com/images/S/aplus-media/vc/f45f2d24-3d13-430e-b5f1-bb9d799216ca.__CR0,0,600,800_PT0_SX300_V1___.jpg)",
            "[https://images-na.ssl-images-amazon.com/images/I/41D1O9CrB%2BL._AC_US40_.jpg](https://images-na.ssl-images-amazon.com/images/I/41D1O9CrB%2BL._AC_US40_.jpg)",
            "[https://images-na.ssl-images-amazon.com/images/I/41NbECHZGnL._AC_US40_.jpg](https://images-na.ssl-images-amazon.com/images/I/41NbECHZGnL._AC_US40_.jpg)",
            "[https://images-na.ssl-images-amazon.com/images/I/41tq5cyBN7L._AC_US40_.jpg](https://images-na.ssl-images-amazon.com/images/I/41tq5cyBN7L._AC_US40_.jpg)",
            "[https://images-na.ssl-images-amazon.com/images/I/41CoqHckY7L._AC_US40_.jpg](https://images-na.ssl-images-amazon.com/images/I/41CoqHckY7L._AC_US40_.jpg)",
            "[https://m.media-amazon.com/images/S/aplus-media/vc/3e5837ea-b85a-476d-b186-8bf7252e463d.__CR0,0,600,600_PT0_SX300_V1___.jpg](https://m.media-amazon.com/images/S/aplus-media/vc/3e5837ea-b85a-476d-b186-8bf7252e463d.__CR0,0,600,600_PT0_SX300_V1___.jpg)"
          ],
          "url": "[https://www.amazon.com/WALI-Premium-Adjustable-Capacity-GSDM003/dp/B07VRB86RQ/ref=sr_1_4?keywords=monitor&qid=1571888481&s=office-products&sr=1-4](https://www.amazon.com/WALI-Premium-Adjustable-Capacity-GSDM003/dp/B07VRB86RQ/ref=sr_1_4?keywords=monitor&qid=1571888481&s=office-products&sr=1-4)",
          "offers": [
            {
              "price": "129.99",
              "currency": "$",
              "availability": "InStock"
            }
          ],
          "breadcrumbs": [
            {
              "name": "Office Products",
              "link": "[https://www.amazon.com/office-products-supplies-electronics-furniture/b/ref=dp_bc_aui_C_1/144-6993873-0840665?ie=UTF8&node=1064954](https://www.amazon.com/office-products-supplies-electronics-furniture/b/ref=dp_bc_aui_C_1/144-6993873-0840665?ie=UTF8&node=1064954)"
            },
            {
              "name": "Office & School Supplies",
              "link": "[https://www.amazon.com/Office-Supplies/b/ref=dp_bc_aui_C_2/144-6993873-0840665?ie=UTF8&node=1069242](https://www.amazon.com/Office-Supplies/b/ref=dp_bc_aui_C_2/144-6993873-0840665?ie=UTF8&node=1069242)"
            },
            {
              "name": "Desk Accessories & Workspace Organizers",
              "link": "[https://www.amazon.com/Desk-Accessories-Workspace-Organizers/b/ref=dp_bc_aui_C_3/144-6993873-0840665?ie=UTF8&node=1069514](https://www.amazon.com/Desk-Accessories-Workspace-Organizers/b/ref=dp_bc_aui_C_3/144-6993873-0840665?ie=UTF8&node=1069514)"
            },
            {
              "name": "Platforms, Stands & Shelves",
              "link": "[https://www.amazon.com/Office-Platforms-Stands-Shelves/b/ref=dp_bc_aui_C_4/144-6993873-0840665?ie=UTF8&node=490597011](https://www.amazon.com/Office-Platforms-Stands-Shelves/b/ref=dp_bc_aui_C_4/144-6993873-0840665?ie=UTF8&node=490597011)"
            },
            {
              "name": "Monitor Arms & Stands",
              "link": "[https://www.amazon.com/Monitor-Arms-Monitor-Stands/b/ref=dp_bc_aui_C_5/144-6993873-0840665?ie=UTF8&node=490624011](https://www.amazon.com/Monitor-Arms-Monitor-Stands/b/ref=dp_bc_aui_C_5/144-6993873-0840665?ie=UTF8&node=490624011)"
            }
          ],
          "probability": 0.9959353
        }
      }
    ]

    Это довольно впечатляюще! Поскольку он уже обработал все разметки, практически все основные метаданные точны!

    Теперь давайте попробуем с обычной статьей на Medium, используя мою предыдущую публикацию в качестве примера:

    curl --verbose \--user '{ваш_ключ}':'' \--header 'Content-Type: application/json' \--data '[{"url": "https://medium.com/@KaiNing/web-crawling-9182a70a4ce5", "pageType": "article"}]' \https://autoextract.scrapinghub.com/v1/extract

    Вот результат:

    [
      {
        "query": {
          "id": "1571974713037-cd8af7c15d5d478f",
          "domain": "medium.com",
          "userQuery": {
            "url": "[https://medium.com/@KaiNing/web-crawling-9182a70a4ce5](/@KaiNing/web-crawling-9182a70a4ce5)",
            "pageType": "article"
          }
        },
        "article": {
          "headline": "web crawling",
          "inLanguage": "en",
          "datePublished": "2019-10-24T21:51:05.174000+00:00",
          "datePublishedRaw": "2019-10-24T21:51:05.174Z",
          "author": "K Ning",
          "authorsList": [
            "K Ning"
          ],
          "description": "web crawling has been around pretty much since the beginning of internet. over the years, so many different technologies emerged and ppl…",
          "url": "[https://medium.com/@KaiNing/web-crawling-9182a70a4ce5](/@KaiNing/web-crawling-9182a70a4ce5)",
          "probability": 0.5449241995811462
        }
      }
    ]

    Тада! Поскольку я пометил это как статью за плату, часть с содержимым сокращена, но все же он хорошо справился с парсингом основного заголовка, автора и описания. Несмотря на довольно низкую вероятность, я думаю, что это связано с длиной контента, который удалось получить.

    Одна интересная особенность - я могу просмотреть статью за плату в режиме инкогнито в Chrome, но сервер не может, видимо, у него другие настройки заголовков или куки уже зарегистрированы в Medium.


    Если найду что-то еще интересное, обязательно обновлю.