diff --git a/CHANGELOG.md b/CHANGELOG.md index e459b4f..d68b290 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ Parts regarding the [documentation website](https://phpscraper.de), the [test pa This project adheres to [Semantic Versioning](http://semver.org/). +## 1.0.0 (2022-11-24) + +- [#151](https://github.com/spekulatius/PHPScraper/issues/151): Migrate website into separate repo. +- [#150](https://github.com/spekulatius/PHPScraper/issues/150): Switch namespaces. See [UPGRADING](https://github.com/spekulatius/PHPScraper/blob/master/UPGRADING.md) for more details. +- [#147](https://github.com/spekulatius/PHPScraper/issues/147): Prepare for v1.0 + ## 0.13.0 (2022-11-21) - [#146](https://github.com/spekulatius/PHPScraper/issues/146): Implement plain text file/URL parsing. diff --git a/websites/.gitignore b/websites/.gitignore deleted file mode 100644 index df07152..0000000 --- a/websites/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -dist/ -.idea -.vscode diff --git a/websites/.nvmrc b/websites/.nvmrc deleted file mode 100644 index 6f7f377..0000000 --- a/websites/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v16 diff --git a/websites/.vuepress/config.js b/websites/.vuepress/config.js deleted file mode 100644 index 727e86c..0000000 --- a/websites/.vuepress/config.js +++ /dev/null @@ -1,83 +0,0 @@ -const fs = require('fs') -const path = require('path') - -module.exports = { - dest: 'dist/', - title: 'PHP Scraper: a web utility for PHP', - description: 'PHP Scraper is providing a simpler way to fetch and parse websites using PHP.', - - plugins: { - 'seo': {}, - 'web-monetization': { address: '$ilp.uphold.com/DrRw6MnEEqBB' }, - 'umami': { trackerUrl: 'https://u.peterthaleikis.com', siteId: '5ee0a886-020d-4fd9-99f1-201ef2691cf6' }, - 'canonical': { baseURL: 'https://phpscraper.de' }, - 'sitemap': { hostname: 'https://phpscraper.de/', changefreq: 'monthly' }, - - '@vuepress/pwa': { - serviceWorker: true, - updatePopup: false - }, - '@vuepress/plugin-back-to-top': {}, - - 'social-share': { - networks: ['telegram', 'line', 'twitter', 'reddit'], - twitterUser: 'spekulatius1984', - fallbackImage: 'https://api.imageee.com/bold?text=PHP%20Scraper:%20Bringing%20Simplicity%20back%20to%20Scraping%20and%20Crawling&bg_image=https://images.unsplash.com/photo-1542762933-ab3502717ce7', - autoQuote: true, - isPlain: true, - }, - }, - serviceWorker: true, - - locales: { - '/': { - lang: 'en-US', - title: 'PHP Scraper: a web utility for PHP', - description: 'PHP Scraper is providing a fuss-free way to scrape and crawl websites using PHP.' - }, - '/de/': { - lang: 'de', - title: 'PHP Scraper: Scraping und Crawling einfach gemacht', - description: 'PHP Scraper: Scraping, Crawling und Daten Sammeln einfach gemacht.' - }, - '/es/': { - lang: 'es', - title: 'PHP Scraper: La simplicidad en el scraping y el crawling', - description: 'PHP Scraper proporciona una forma más sencilla de obtener y analizar sitios web utilizando PHP.' - }, - '/fr/': { - lang: 'fr', - title: 'PHP Scraper: Simplifier les opérations de scraping et de crawling', - description: 'PHP Scraper offre un moyen plus simple de récupérer et d\'analyser des sites web en utilisant PHP.' - }, - '/vi/': { - lang: 'vi', - title: 'PHP Scraper: Đưa sự đơn giản trở lại Thu thập và Cào', - description: 'PHP Scraper đang cung cấp một cách dễ dàng phân tích và thu thập dữ liệu các trang web bằng PHP.' - }, - }, - themeConfig: { - domain: 'https://phpscraper.de', - repo: 'spekulatius/phpscraper', - docsDir: 'websites', - editLinks: true, - smoothScroll: true, - locales: { - '/': { - ...require('./config.theme.en') - }, - '/de/': { - ...require('./config.theme.de') - }, - '/es/': { - ...require('./config.theme.es') - }, - '/fr/': { - ...require('./config.theme.fr') - }, - '/vi/': { - ...require('./config.theme.vi') - }, - } - } -}; diff --git a/websites/.vuepress/config.theme.de.js b/websites/.vuepress/config.theme.de.js deleted file mode 100644 index 275dc25..0000000 --- a/websites/.vuepress/config.theme.de.js +++ /dev/null @@ -1,65 +0,0 @@ -module.exports = { - selectText: '🇺🇳️', - label: 'Deutsch', - ariaLabel: 'Sprachen', - editLinkText: 'Diese Seite auf GitHub bearbeiten', - lastConfig: 'Zuletzt aktualisiert', - serviceWorker: { - updatePopup: { - message: "Neue Inhalte sind verfügbar.", - buttonText: "Aktualisieren" - } - }, - sidebar: [ - { - title: '', - collapsable: false, - children: [ - 'de/examples/scrape-website-title', - 'de/examples/scrape-header-tags', - 'de/examples/scrape-meta-tags', - 'de/examples/scrape-social-media-meta-tags', - ], - }, - { - title: '', - collapsable: false, - children: [ - 'de/examples/headings', - 'de/examples/outline', - 'de/examples/paragraphs', - 'de/examples/lists', - 'de/examples/extract-keywords', - 'de/examples/scrape-images', - 'de/examples/scrape-links', - 'de/examples/navigation', - ], - }, - { - title: 'APIs', - collapsable: false, - children: [ - 'de/apis/alibaba', - 'de/apis/amazon', - 'de/apis/facebook', - 'de/apis/etsy', - 'de/apis/instagram', - 'de/apis/linkedin', - 'de/apis/target', - 'de/apis/tiktok', - 'de/apis/walmart', - 'de/apis/zalando', - ], - }, - { - title: 'usw', - collapsable: false, - children: [ - 'de/misc/sponsors', - 'de/misc/tutorials', - 'de/misc/show-case', - 'de/misc/support', - ], - }, - ] -} diff --git a/websites/.vuepress/config.theme.en.js b/websites/.vuepress/config.theme.en.js deleted file mode 100644 index 997a97c..0000000 --- a/websites/.vuepress/config.theme.en.js +++ /dev/null @@ -1,68 +0,0 @@ -module.exports = { - selectText: '🇺🇳️', - label: 'English', - ariaLabel: 'Languages', - editLinkText: 'Edit this page on GitHub', - lastConfig: 'Last updated', - serviceWorker: { - updatePopup: { - message: "New content is available.", - buttonText: "Refresh" - } - }, - sidebar: [ - { - title: '', - collapsable: false, - children: [ - 'examples/scrape-website-title', - 'examples/scrape-header-tags', - 'examples/scrape-meta-tags', - 'examples/scrape-social-media-meta-tags', - 'examples/scrape-feeds', - 'examples/parse-csv-json-and-xml-files', - ], - }, - { - title: '', - collapsable: false, - children: [ - 'examples/headings', - 'examples/outline', - 'examples/paragraphs', - 'examples/lists', - 'examples/extract-keywords', - 'examples/scrape-images', - 'examples/scrape-links', - 'examples/navigation', - 'examples/custom-selectors', - ], - }, - { - title: 'APIs', - collapsable: false, - children: [ - 'apis/alibaba', - 'apis/amazon', - 'apis/facebook', - 'apis/etsy', - 'apis/instagram', - 'apis/linkedin', - 'apis/target', - 'apis/tiktok', - 'apis/walmart', - 'apis/zalando', - ], - }, - { - title: 'MISC', - collapsable: false, - children: [ - 'misc/sponsors', - 'misc/tutorials', - 'misc/show-case', - 'misc/support', - ], - }, - ] -} diff --git a/websites/.vuepress/config.theme.es.js b/websites/.vuepress/config.theme.es.js deleted file mode 100644 index 0855a9b..0000000 --- a/websites/.vuepress/config.theme.es.js +++ /dev/null @@ -1,65 +0,0 @@ -module.exports = { - selectText: '🇺🇳️', - label: 'Español', - ariaLabel: 'Idiomas', - editLinkText: 'Editar esta página en GitHub', - lastConfig: 'Última actualizado', - serviceWorker: { - updatePopup: { - message: "Hay nuevos contenidos disponibles.", - buttonText: "Actualizar" - } - }, - sidebar: [ - { - title: '', - collapsable: false, - children: [ - 'es/examples/scrape-website-title', - 'es/examples/scrape-header-tags', - 'es/examples/scrape-meta-tags', - 'es/examples/scrape-social-media-meta-tags', - ], - }, - { - title: '', - collapsable: false, - children: [ - 'es/examples/headings', - 'es/examples/outline', - 'es/examples/paragraphs', - 'es/examples/lists', - 'es/examples/extract-keywords', - 'es/examples/scrape-images', - 'es/examples/scrape-links', - 'es/examples/navigation', - ], - }, - { - title: 'APIs', - collapsable: false, - children: [ - 'es/apis/alibaba', - 'es/apis/amazon', - 'es/apis/facebook', - 'es/apis/etsy', - 'es/apis/instagram', - 'es/apis/linkedin', - 'es/apis/target', - 'es/apis/tiktok', - 'es/apis/walmart', - 'es/apis/zalando', - ], - }, - { - title: 'Misceláneas', - collapsable: false, - children: [ - 'es/misc/sponsors', - 'es/misc/tutorials', - 'es/misc/show-case', - 'es/misc/support', - ], - }, - ] -} diff --git a/websites/.vuepress/config.theme.fr.js b/websites/.vuepress/config.theme.fr.js deleted file mode 100644 index 8f86324..0000000 --- a/websites/.vuepress/config.theme.fr.js +++ /dev/null @@ -1,65 +0,0 @@ -module.exports = { - selectText: '🇺🇳️', - label: 'Français', - ariaLabel: 'Langues', - editLinkText: 'Modifier cette page sur GitHub', - lastConfig: 'Dernière mise à jour', - serviceWorker: { - updatePopup: { - message: "Le nouveau contenu est disponible.", - buttonText: "Rafraîchir" - } - }, - sidebar: [ - { - title: '', - collapsable: false, - children: [ - 'fr/examples/scrape-website-title', - 'fr/examples/scrape-header-tags', - 'fr/examples/scrape-meta-tags', - 'fr/examples/scrape-social-media-meta-tags', - ], - }, - { - title: '', - collapsable: false, - children: [ - 'fr/examples/headings', - 'fr/examples/outline', - 'fr/examples/paragraphs', - 'fr/examples/lists', - 'fr/examples/extract-keywords', - 'fr/examples/scrape-images', - 'fr/examples/scrape-links', - 'fr/examples/navigation', - ], - }, - { - title: 'APIs', - collapsable: false, - children: [ - 'fr/apis/alibaba', - 'fr/apis/amazon', - 'fr/apis/facebook', - 'fr/apis/etsy', - 'fr/apis/instagram', - 'fr/apis/linkedin', - 'fr/apis/target', - 'fr/apis/tiktok', - 'fr/apis/walmart', - 'fr/apis/zalando', - ], - }, - { - title: 'MISC', - collapsable: false, - children: [ - 'fr/misc/sponsors', - 'fr/misc/tutorials', - 'fr/misc/show-case', - 'fr/misc/support', - ], - }, - ] -} diff --git a/websites/.vuepress/config.theme.vi.js b/websites/.vuepress/config.theme.vi.js deleted file mode 100644 index 5b0eb0f..0000000 --- a/websites/.vuepress/config.theme.vi.js +++ /dev/null @@ -1,65 +0,0 @@ -module.exports = { - selectText: '🇻🇳', - label: 'Tiếng Việt', - ariaLabel: 'Ngôn ngữ', - editLinkText: 'Chỉnh sửa trang này trên GitHub', - lastConfig: 'Cập nhật lần cuối', - serviceWorker: { - updatePopup: { - message: "Nội dung mới có sẵn.", - buttonText: "Tải lại" - } - }, - sidebar: [ - { - title: '', - collapsable: false, - children: [ - 'vi/examples/scrape-website-title', - 'vi/examples/scrape-header-tags', - 'vi/examples/scrape-meta-tags', - 'vi/examples/scrape-social-media-meta-tags', - ], - }, - { - title: '', - collapsable: false, - children: [ - 'vi/examples/headings', - 'vi/examples/outline', - 'vi/examples/paragraphs', - 'vi/examples/lists', - 'vi/examples/extract-keywords', - 'vi/examples/scrape-images', - 'vi/examples/scrape-links', - 'vi/examples/navigation', - ], - }, - // { - // title: 'APIs', - // collapsable: false, - // children: [ - // 'apis/alibaba', - // 'apis/amazon', - // 'apis/facebook', - // 'apis/etsy', - // 'apis/instagram', - // 'apis/linkedin', - // 'apis/target', - // 'apis/tiktok', - // 'apis/walmart', - // 'apis/zalando', - // ], - // }, - { - title: 'MISC', - collapsable: false, - children: [ - 'vi/misc/sponsors', - 'vi/misc/tutorials', - 'vi/misc/show-case', - 'vi/misc/support', - ], - }, - ] -} diff --git a/websites/.vuepress/public/_redirects b/websites/.vuepress/public/_redirects deleted file mode 100644 index de2fb32..0000000 --- a/websites/.vuepress/public/_redirects +++ /dev/null @@ -1,61 +0,0 @@ -/basic/installation /#installation -/apis/amazon /apis/amazon.html -/apis/etsy /apis/etsy.html -/apis/facebook /apis/facebook.html -/apis/target /apis/target.html -/apis/tiktok /apis/tiktok.html -/examples/extract-keywords /examples/extract-keywords.html -/examples/headings /examples/headings.html -/examples/navigation /examples/navigation.html -/examples/scrape-social-media-meta-tags /examples/scrape-social-media-meta-tags.html -/examples/scrape-website-title /examples/scrape-website-title.html -/support/support /support/support.html -/es/apis/alibaba /es/apis/alibaba.html -/es/apis/amazon /es/apis/amazon.html -/es/apis/etsy /es/apis/etsy.html -/es/apis/facebook /es/apis/facebook.html -/es/apis/instagram /es/apis/instagram.html -/es/apis/linkedin /es/apis/linkedin.html -/es/apis/target /es/apis/target.html -/es/apis/tiktok /es/apis/tiktok.html -/es/apis/walmart /es/apis/walmart.html -/es/apis/zalando /es/apis/zalando.html -/es/examples/extract-keywords /es/examples/extract-keywords.html -/es/examples/headings /es/examples/headings.html -/es/examples/navigation /es/examples/navigation.html -/es/examples/outline /es/examples/outline.html -/es/examples/scrape-header-tags /es/examples/scrape-header-tags.html -/es/examples/scrape-images /es/examples/scrape-images.html -/es/examples/scrape-meta-tags /es/examples/scrape-meta-tags.html -/es/examples/scrape-social-media-meta-tags /es/examples/scrape-social-media-meta-tags.html -/es/examples/scrape-website-title /es/examples/scrape-website-title.html -/es/support/more-examples /es/support/more-examples.html -/es/support/support /es/support/support.html -/de/apis/alibaba /de/apis/alibaba.html -/de/apis/facebook /de/apis/facebook.html -/de/examples/extract-keywords /de/examples/extract-keywords.html -/de/examples/navigation /de/examples/navigation.html -/de/examples/paragraphs /de/examples/paragraphs.html -/de/examples/scrape-header-tags /de/examples/scrape-header-tags.html -/de/examples/scrape-meta-tags /de/examples/scrape-meta-tags.html -/fr/apis/alibaba /fr/apis/alibaba.html -/fr/apis/amazon /fr/apis/amazon.html -/fr/apis/etsy /fr/apis/etsy.html -/fr/apis/facebook /fr/apis/facebook.html -/fr/apis/instagram /fr/apis/instagram.html -/fr/apis/linkedin /fr/apis/linkedin.html -/fr/apis/target /fr/apis/target.html -/fr/apis/tiktok /fr/apis/tiktok.html -/fr/apis/zalando /fr/apis/zalando.html -/fr/examples/headings /fr/examples/headings.html -/fr/examples/lists /fr/examples/lists.html -/fr/examples/paragraphs /fr/examples/paragraphs.html -/fr/examples/scrape-images /fr/examples/scrape-images.html -/fr/examples/scrape-meta-tags /fr/examples/scrape-meta-tags.html -/fr/examples/scrape-website-title /fr/examples/scrape-website-title.html -/fr/support/more-examples /fr/support/more-examples.html -/support/tutorials.html /misc/tutorials.html -/de/support/tutorials.html /de/misc/tutorials.html -/es/support/tutorials.html /es/misc/tutorials.html -/fr/support/tutorials.html /fr/misc/tutorials.html -/vi/support/tutorials.html /vi/misc/tutorials.html \ No newline at end of file diff --git a/websites/.vuepress/public/logo-dark.png b/websites/.vuepress/public/logo-dark.png deleted file mode 100644 index 9720a9b..0000000 Binary files a/websites/.vuepress/public/logo-dark.png and /dev/null differ diff --git a/websites/.vuepress/public/logo-light-with-space.png b/websites/.vuepress/public/logo-light-with-space.png deleted file mode 100644 index 5254e6b..0000000 Binary files a/websites/.vuepress/public/logo-light-with-space.png and /dev/null differ diff --git a/websites/.vuepress/public/logo-light.png b/websites/.vuepress/public/logo-light.png deleted file mode 100644 index 5c475ba..0000000 Binary files a/websites/.vuepress/public/logo-light.png and /dev/null differ diff --git a/websites/.vuepress/public/logo.svg b/websites/.vuepress/public/logo.svg deleted file mode 100644 index 8fea8b9..0000000 --- a/websites/.vuepress/public/logo.svg +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - diff --git a/websites/README.md b/websites/README.md deleted file mode 100644 index 3b63ded..0000000 --- a/websites/README.md +++ /dev/null @@ -1,368 +0,0 @@ ---- -image: https://api.imageee.com/bold?text=PHP%20Scraper:%20a%20web%20utility%20for%20PHP&bg_image=https://images.unsplash.com/photo-1542762933-ab3502717ce7 ---- - -
PHP Scraper: a web utility for PHP
-================================== - -

- - PHP Scraper: Bringing Simplicity back to Scraping and Crawling - -

- - Unit Tests - - - Total Downloads - - - Latest Version - - - License - -

-

- By Peter Thaleikis -

-

- -PHPScraper is a universal web-scraping util for PHP, built with simplicity in mind. The goal is to make xPath Selectors *optional* and avoid the commonly needed boilerplate code. Just create an instance of *PHPScraper*, *go* to a website, and start collecting data. The examples below tell the story much better. Have a look! - -Under the hood, it uses - -- [Goutte](https://github.com/FriendsOfPHP/Goutte) to access the web -- [League/URI](https://github.com/thephpleague/uri) to process URLs -- [donatello-za/rake-php-plus](https://github.com/donatello-za/rake-php-plus) to extract and analyze keywords - -See [composer.json](https://github.com/spekulatius/PHPScraper/blob/master/composer.json) for more details. - - -:timer_clock: PHPScraper in 5 Minutes explained ------------------------------------------------ - -Here are a few impressions of the way the library works. More examples are this website in the various sections. - -### Basics: Flexible Calling as an Attribute or Method - -All scraping functionality can be accessed either as a function call or a property call. For example, the title can be accessed in two ways: - -```php -// Prep -$web = new \Spekulatius\PHPScraper\PHPScraper; -$web->go('https://google.com'); - -// Returns "Google" -echo $web->title; - -// Also returns "Google" -echo $web->title(); -``` - -### :battery: Batteries included: Meta-Data, Links, Images, Headings, Content, Keywords, ... - -Many common use cases are covered already. You can find prepared extractors for various HTML tags, including interesting attributes. You can filter and combine these to your needs. In some cases there is an option to get a simple or detailed version, here in the case of `linksWithDetails`: - -```PHP -$web = new \Spekulatius\PHPScraper\PHPScraper; - -// Contains: -// -// -// -// -$web->go('https://test-pages.phpscraper.de/links/image-urls.html'); - -// Get the first link on the page and print the result -print_r($web->linksWithDetails[0]); -// [ -// 'url' => 'https://placekitten.com/456/500', -// 'protocol' => 'https', -// 'text' => '', -// 'title' => null, -// 'target' => null, -// 'rel' => 'ugc', -// 'image' => [ -// 'https://placekitten.com/456/400', -// 'https://placekitten.com/456/300' -// ], -// 'isNofollow' => false, -// 'isUGC' => true, -// 'isSponsored' => false, -// 'isMe' => false, -// 'isNoopener' => false, -// 'isNoreferrer' => false, -// ] -``` - -::: tip Null -If there aren't any matching elements (here links) on the page, an empty array will be returned. - -For methods that normally return a single string (e.g. `title`), `null` will be returned in this case. -::: - -Details such as `follow_redirects`, etc. are optional configuration parameters (see below). - -Most of the DOM should be covered using these methods: - -- several [meta-tags](/examples/scrape-meta-tags.html) and other [``-information](/examples/scrape-header-tags.html) -- [Social-Media information](/examples/scrape-social-media-meta-tags.html) like Twitter Card and Facebook Open Graph -- Content: [Headings](/examples/headings.html), [Outline](/examples/outline.html), [Texts](/examples/paragraphs.html) and [Lists](/examples/lists.html) -- [Keywords](/examples/extract-keywords.html) -- [Images](/examples/scrape-images.html) & [Links](/examples/scrape-links.html). - -**More examples are included in the [tests](https://github.com/spekulatius/PHPScraper/tree/master/tests).** - - -### Download Files - -Besides processing the content on the page itself, you can download files using `fetchAsset`: - -```php -// Absolute URL -$csvString = $web->fetchAsset('https://test-pages.phpscraper.de/test.csv'); - -// Relative URL after navigation -$csvString = $web - ->go('https://test-pages.phpscraper.de/meta/lorem-ipsum.html') - ->fetchAsset('/test.csv'); -``` - -You will only need to write the content into a file or cloud storage. - -::: warning 404s -If the intended URL isn't available an exception will be thrown. Make sure to handle this case by wrapping your code in a try-catch block: - -```php -try { - // ... -} catch (\Exception $e) { - // ... -} -``` -::: - - -### Process the RSS feeds, `sitemap.xml`, etc. - -PHPScraper can assist in collecting feeds such as [RSS feeds, `sitemap.xml`-entries and static search indexes](/examples/scrape-feeds.html). This can be useful when deciding on the next page to crawl or build up a list of pages on a website. - -Here we are processing the sitemap into a set of [`FeedEntry`-DTOs](https://github.com/spekulatius/PHPScraper/blob/pre-release-tweaks/src/DataTransferObjects/FeedEntry.php): - -```php -(new \Spekulatius\PHPScraper\PHPScraper) - ->go('https://phpscraper.de') - ->sitemap - -// array(131) { -// [0]=> -// object(spekulatius\DataTransferObjects\FeedEntry)#165 (3) { -// ["title"]=> -// string(0) "" -// ["description"]=> -// string(0) "" -// ["link"]=> -// string(22) "https://phpscraper.de/" -// } -// [1]=> -// ... -``` - -::: tip Fallback-Methods -Whenever post-processing is applied, you can fall back to the underlying `*Raw`-methods. -::: - -### Process CSV-, XML- and JSON files and URLs - -PHPScraper comes out-of-the-box with file / URL processing methods for CSV-, XML- and JSON: - -- `parseJson` -- `parseXml` -- `parseCsv` -- `parseCsvWithHeader` (generates an asso. array using the first row) - -Each method can process both strings as well as URLs: - -```php -// Parse CSV into a simple array: -$csv = $web->parseJson('[{"title": "PHP Scraper: a web utility for PHP", "url": "https://phpscraper.de"}]'); -// [ -// 'title' => 'PHP Scraper: a web utility for PHP', -// 'url' => 'https://phpscraper.de' -// ] - -// Fetch and parse CSV into a simple array: -$csv = $web->parseCsv('https://test-pages.phpscraper.de/test.csv'); -// [ -// ['date', 'value'], -// ['1945-02-06', 4.20], -// ['1952-03-11', 42], -// ] - -// Fetch and parse CSV with first row as header into an asso. array structure: -$csv = $web->parseCsvWithHeader('https://test-pages.phpscraper.de/test.csv'); -// [ -// ['date' => '1945-02-06', 'value' => 4.20], -// ['date' => '1952-03-11', 'value' => 42], -// ] -``` - -::: tip Additional CSV parsing parameters -Additional CSV parsing parameters such as separator, enclosure and escape are possible. -::: - - -### There is more! - -There are plenty of examples on the PHPScraper website and in the [tests](https://github.com/spekulatius/PHPScraper/tree/master/tests). - -Check the [`playground.php`](https://github.com/spekulatius/PHPScraper/blob/master/playground.php) if you prefer learning by doing. You get it up and running with: - -```bash -$ git clone git@github.com:spekulatius/PHPScraper.git && composer update -``` - -:muscle: Roadmap ----------------- - -The future development is organized into [milestones](https://github.com/spekulatius/PHPScraper/milestones?direction=asc&sort=title). Releases follow [semver](https://semver.org/). - -### v1: [Building the first stable version](https://github.com/spekulatius/PHPScraper/milestone/4) - -- Improve documentation and examples. -- Organize code better (move websites into separate repos, etc.) -- Add support for feeds and some typical file types. - -### v2: [Expand the functionality and cover more 'types'](https://github.com/spekulatius/PHPScraper/milestone/5) - -- Expand to parse a wider range of types, elements, embeds, etc. -- Improve performance with caching and concurrent fetching of assets -- Minor improvements for parsing methods - -### v3: [Expand to provide more guidance on building custom scrapers on top of PHPScraper](https://github.com/spekulatius/PHPScraper/milestone/6) - -TBC. - - -:heart_eyes: Sponsors ---------------------- - -PHPScraper is proudly supported by: - - - -If you find PHPScraper useful to your work or simply want to support the development, please consider a [sponsorship](https://github.com/sponsors/spekulatius) or [donation](https://www.buymeacoffee.com/spekulatius). Thank you :muscle: - - -:gear: Configuration (optional) -------------------------------- - -If needed, you can use the following configuration options: - -### User Agent - -You can set the browser agent using `setConfig`: - -```php -$web->setConfig([ - 'agent' => 'Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0' -]); -``` - -It defaults to `Mozilla/5.0 (compatible; PHP Scraper/1.x; +https://phpscraper.de)`. - -### Proxy Support - -You can configure proxy support with `setConfig`: - -```php -$web->setConfig(['proxy' => 'http://user:password@127.0.0.1:3128']); -``` - -::: tip -If you're looking for decent prices residential proxy, check [IProyal](https://iproyal.com?r=119987). -::: - -### Timeout - -You can set the `timeout` using `setConfig`: - -```php -$web->setConfig(['timeout' => 15]); -``` - -Setting the timeout to zero will disable it. - -### Disabling SSL - -While unrecommended, it might be required to disable SSL checks. You can do so using: - -```php -$web->setConfig(['disable_ssl' => true]); -``` - -You can call `setConfig` multiple times. It stores the config and merges it with previous settings. This should be kept in mind in the unlikely use-case when unsetting values. - - -:rocket: Installation with Composer ------------------------------------ - -```bash -composer require spekulatius/phpscraper -``` - -After the installation, the package will be picked up by the Composer autoloader. If you are using a common PHP application or framework such as Laravel or Symfony you can start scraping now :rocket: - -If you are using a framework such as Laravel, Symfony, Laminas, Phalcon, or CakePHP, you won't need this step. The autoloader is automatically included. -If not or you are building a standalone-scraper, please include the autoloader in `vendor/` at the top of your file: - -```php - - -Möchten Sie dieses Projekt unterstützen? [Schreib mir](https://peterthaleikis.com/contact). - - -Beispiele: Code sagt mehr als Tausend Worte. --------------------------------------------- - -Hier sind einige Beispiele dafür, was die Web-Scraping-Bibliothek an dieser Stelle tun kann: - -### Meta-Informationen Scrapen: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -/** - * Navigate to the test page. It contains: - * - * - * - * - * - */ -$web->go('https://test-pages.phpscraper.de/meta/lorem-ipsum.html'); - -// Get the information: -echo $web->author; // "Lorem ipsum" -echo $web->description; // "Lorem ipsum dolor etc." -echo $web->image; // "https://test-pages.phpscraper.de/assets/cat.jpg" -``` - -Nahezu alle Informationen können direkt als string oder array genutzt werden. - - -### Scrapen von Inhalten, beispielsweise Bilder: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -/** - * Navigate to the test page. This page contains two images: - * - * absolute path - * relative path - */ -$web->go('https://test-pages.phpscraper.de/meta/lorem-ipsum.html'); - -var_dump($web->imagesWithDetails); -/** - * [ - * 'url' => 'https://test-pages.phpscraper.de/assets/cat.jpg', - * 'alt' => 'absolute path', - * 'width' => null, - * 'height' => null, - * ], - * [ - * 'url' => 'https://test-pages.phpscraper.de/assets/cat.jpg', - * 'alt' => 'relative path', - * 'width' => null, - * 'height' => null, - * ] - */ -``` - -Hier werden einige zusätzliche, *optionale* Informationen im Array als Details zurückgegeben. Alternativ ist für dieses Beispiel ist auch eine vereinfachte Liste nur mit den Bildern mit `$web->images` verfügbar: - -```php -// Wie oben. - -var_dump($web->images); -/** - * [ - * 'https://test-pages.phpscraper.de/assets/cat.jpg', - * 'https://test-pages.phpscraper.de/assets/cat.jpg', - * ] - * - * // Hinweis: Doppelt, da die Seite das Bild mehrfach enthält. - */ -``` - -Mehr Beispielcode finden Sie in den Einzelbeispielen und in den Tests. - - -Installation ------------- - -Die Installation erfolgt üblicherweise mit [Composer](https://getcomposer.org). - -### Installation mit Composer - -```bash -composer require spekulatius/phpscraper -``` - -Nach Abschluss der Installation wird das Paket vom Composer-Autoloader geladen. Damit wird in den meisten PHP applikationen sichergstellt, dass die Klassen entsprechend geladen werden können. Mit dem Scrapen kann direkt begonnen werden. Sie können nun eines der aufgeführten Beispiele oder weiteren Beispiele aus den `tests/` verwenden. - -### Verwendung in VanillaPHP-Projekten - -Wenn Sie ein VanillaPHP-Projekt bauen, müssen Sie den Autoloader oben im Skript einbinden: - -```php -require 'vendor/autoload.php'; -``` - -Wenn Sie ein Framework wie Laravel, Symfony, Laminas, Phalcon, oder CakePHP verwenden, brauchen Sie diesen Schritt nicht. Der Autoloader übernimmt die Arbeit. - - -Konfiguration -------------- - -Die weitere Konfiguration ist optional. Unterhalb finden Sie die gegenwärtig verfügbaren Optionen: - -### Proxy - -Falls Sie Proxies benötigen können Sie PHPScraper wie folgt konfigurieren: - -```php -$web->setConfig(['proxy' => 'http://user:password@127.0.0.1:3128']); -``` - -::: tip -Falls Sie nach einem günstigen Proxy suchen ist [IProyal](https://iproyal.com?r=119987) einen Blick wert. -::: - -### Timeout setzen - -Das `timeout` kann mit `setConfig` gesetzt werden: - -```php -$web->setConfig(['timeout' => 15]); -``` - -Der timeout kann mit `0` gedeaktiviert werden. - -### Disabling SSL - -Während es nicht empfohlen ist, kann es notwendig sein die SSL checks zu deaktivieren. Dies kann wie folgt erreicht werden: - -```php -$web->setConfig(['disable_ssl' => true]); -``` - -`setConfig` kann mehrfach aufgerufen werden. Es speichert die Konfiguration und merged frühere Einstellungen. Dies sollte bedacht werden, wenn man etwas zurücksetzen will. - - -Ein Problem gefunden und gefixt? Super! ---------------------------------------- - -Bevor Sie loslegen, machen Sie sich mit den [Contribution Guidelines](/contributing.html) vertraut. Bei Fragen bitte eine kurze Nachricht oder Email. - - -Tests: Damit es wirklich funktioniert! --------------------------------------- - -Der Code wird grob mit End-to-End-Tests abgedeckt. Dazu werden einfache Webseiten unter *https://test-pages.phpscraper.de/* gehostet, geladen und geparst mit [PHPUnit](https://phpunit.de/). Diese Tests sind auch als Beispiele geeignet - siehe `tests/`! - -Trotzdem gibt es wahrscheinlich Randfälle, die nicht funktionieren und Probleme verursachen können. Wenn Sie einen finden, melden Sie bitte einen Fehler auf GitHub. diff --git a/websites/de/apis/alibaba.md b/websites/de/apis/alibaba.md deleted file mode 100644 index 38cd877..0000000 --- a/websites/de/apis/alibaba.md +++ /dev/null @@ -1,16 +0,0 @@ -# Alibaba/AliExpress Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Alibaba erwägen wir die Implementierung einer API mit folgendem Umfang. - -## Vorgeschlagene unterstützte Endpunkte - -- Suche nach Produkten nach Schlüsselwort -- Produktinformation abrufen - -Bitte beachten Sie, dass diese Informationen nicht endgültig sind und sich noch ändern können. - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/amazon.md b/websites/de/apis/amazon.md deleted file mode 100644 index c25b1ed..0000000 --- a/websites/de/apis/amazon.md +++ /dev/null @@ -1,22 +0,0 @@ -# Amazon Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Amazon ziehen wir die Implementierung einer API mit folgendem Umfang in Betracht. - -## Vorgeschlagene unterstützte Endpunkte - -- Produktinformation abrufen -- Empfehlungen abrufen -- Informationen zu Bewertungen abrufen -- Verkäufer-Informationen abrufen -- Alle Verkäuferpreise abrufen -- Nach Produkten suchen mit Schlüsselwörter oder per Verkäufer-ID - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/etsy.md b/websites/de/apis/etsy.md deleted file mode 100644 index 7f83693..0000000 --- a/websites/de/apis/etsy.md +++ /dev/null @@ -1,22 +0,0 @@ -# Etsy Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Etsy ziehen wir die Implementierung einer API mit folgendem Umfang in Betracht. - -## Vorgeschlagene unterstützte Endpunkte - -- Produktinformation abrufen -- Empfehlungen abrufen -- Informationen zu Bewertungen abrufen -- Verkäufer-Informationen abrufen -- Alle Verkäuferpreise abrufen -- Nach Produkten suchen mit Schlüsselwörter oder per Verkäufer-ID - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/facebook.md b/websites/de/apis/facebook.md deleted file mode 100644 index 4b5ccfa..0000000 --- a/websites/de/apis/facebook.md +++ /dev/null @@ -1,28 +0,0 @@ -# Facebook Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Facebook erwägen wir die Implementierung einer API mit folgendem Umfang. - -## Vorgeschlagene unterstützte Endpunkte - -- Benutzer: Öffentliches Benutzerprofil -- Benutzer: Andere soziale Konten -- Benutzer: Freundesliste -- Benutzer: Bilder -- Benutzer: Standortbeiträge -- Benutzer: Benutzerbeiträge -- öffentliche Gruppen und private Gruppen mit Schlüssel: Öffentliches Gruppenprofil -- öffentliche Gruppen und private Gruppen mit Schlüssel: Mitgliederliste -- öffentliche Gruppen und private Gruppen mit Schlüssel: Bilder -- öffentliche Gruppen und private Gruppen mit Schlüssel: Standort Beiträge -- öffentliche Gruppen und private Gruppen mit Schlüssel: Beiträge -- Beitrag: Öffentliche Beitragsdetails (inkl. Kommentare, Likes, Likers, etc.) - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/instagram.md b/websites/de/apis/instagram.md deleted file mode 100644 index 69591f4..0000000 --- a/websites/de/apis/instagram.md +++ /dev/null @@ -1,34 +0,0 @@ -# Instagram Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Instagram erwägen wir die Implementierung einer API mit folgendem Umfang. - -## Vorgeschlagene unterstützte Endpunkte - -- Benutzer: Profil Details -- Benutzer: Highlights -- Benutzer: Beiträge -- Benutzer: Getaggte Beiträge -- Benutzer: Öffentliche Beiträge -- Benutzer: Follower -- Benutzer: Geschichten erhalten -- Benutzer: Aktueller Status -- Benutzer: Andere soziale Konten -- Öffentliche Beiträge: Kommentare -- Öffentlicher Beitrag: Likers -- Story-Downloader mit Konvertierung in mp4, mp3, etc. -- Hashtag-Beiträge -- Standort-Posts -- Standort-Suche -- Details zum Beitrag -- Verwandte Profile -- Suche - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/linkedin.md b/websites/de/apis/linkedin.md deleted file mode 100644 index 7cdbb8a..0000000 --- a/websites/de/apis/linkedin.md +++ /dev/null @@ -1,21 +0,0 @@ -# LinkedIn Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für LinkedIn ziehen wir die Implementierung einer API mit folgendem Umfang in Betracht. - -## Vorgeschlagene unterstützte Endpunkte - -- Benutzer: Profil Details -- Benutzer: Beiträge -- Beitrag: Video Downloader und Konverter. -- Unternehmen: Profil-Details -- Job-Suche - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/target.md b/websites/de/apis/target.md deleted file mode 100644 index f7a2ff4..0000000 --- a/websites/de/apis/target.md +++ /dev/null @@ -1,18 +0,0 @@ -# Target Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Target ziehen wir die Implementierung einer API mit folgendem Umfang in Betracht. - -## Vorgeschlagene unterstützte Endpunkte - -- Produktdetails abrufen -- Schlüsselwortsuche für Produkte - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/tiktok.md b/websites/de/apis/tiktok.md deleted file mode 100644 index 98fdb41..0000000 --- a/websites/de/apis/tiktok.md +++ /dev/null @@ -1,21 +0,0 @@ -# TikTok Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für TikTok erwägen wir die Implementierung einer API mit dem folgenden Umfang. - -## Vorgeschlagene unterstützte Endpunkte - -- Suche nach Tag -- Benutzer: Öffentliche Profildetails -- Benutzer: Andere soziale Konten -- Video-Details -- Video Download mit Konvertierung in mp4, mp3, etc. und ohne Wasserzeichen - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/walmart.md b/websites/de/apis/walmart.md deleted file mode 100644 index 6a6838d..0000000 --- a/websites/de/apis/walmart.md +++ /dev/null @@ -1,18 +0,0 @@ -# Walmart Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Walmart ziehen wir die Implementierung einer API mit folgendem Umfang in Betracht. - -## Vorgeschlagene unterstützte Endpunkte - -- Produktdetails abrufen -- Schlüsselwortsuche für Produkte - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/apis/zalando.md b/websites/de/apis/zalando.md deleted file mode 100644 index eb7f74c..0000000 --- a/websites/de/apis/zalando.md +++ /dev/null @@ -1,18 +0,0 @@ -# Zalando Scraper API - -Das Team hinter PHP Scraper arbeitet daran, kommerzielle APIs für verschiedene gängige Anwendungsfälle und Plattformen bereitzustellen. Diese APIs werden nicht selbst gehostet. Sie müssen sich keine Gedanken über rotierende IPs/Proxies machen und einen Headless-Browser wie Puppeteer verwenden. Mit einem einfachen API-Aufruf erhalten Sie alle erforderlichen Informationen. Die Dienste werden auf der Grundlage einer attraktiven, nutzungsabhängigen Gebührenstruktur bereitgestellt. - -Für Zalando erwägen wir die Implementierung einer API mit folgendem Umfang. - -## Vorgeschlagene unterstützte Endpunkte - -- Produktdetails abrufen -- Schlüsselwortsuche für Produkte - -::: tip -Bitte beachten Sie, dass diese Liste der API-Endpunkte *nicht* endgültig ist und sich wahrscheinlich noch ändern wird. -::: - -## Plattform-Unterstützung - -Mit dem Ansatz, eine verwaltete API zu verwenden, müssen sich die Nutzer keine Gedanken mehr über rotierende Proxys, Skalierungsprobleme und Ausfälle machen. Außerdem wird eine breite Palette von Plattformen unterstützt. Sie können problemlos in NodeJS, Python (ohne Requests oder Beautifulsoap), Golang usw. integriert werden. Jede Plattform, die es erlaubt, GET-Anfragen auszuführen, kann so programmiert werden, dass sie Daten von diesem Dienst abruft. diff --git a/websites/de/examples/extract-keywords.md b/websites/de/examples/extract-keywords.md deleted file mode 100644 index 68472c5..0000000 --- a/websites/de/examples/extract-keywords.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -image: https://api.imageee.com/bold?text=PHP:%20Extract%20Keywords&bg_image=https://images.unsplash.com/photo-1542762933-ab3502717ce7 ---- - -# Keywords Extrahieren - -Während es oft ausreicht, Inhalte zu scrapen, müssen Sie manchmal wichtige Begriffe und Phrasen (Keywords) aus diesen Inhalten extrahieren. PHPScraper ermöglicht es Ihnen, die Keywords der Website direkt zu extrahieren. Hierfür verwendet er: - -- den Titel der Website, -- die Meta-Tags, -- alle Überschriften, -- die Absätze auf der Seite, -- Link-Anker und Link-Titel sowie -- Titelattribute bei Bildern - -Auch wenn diese Schlüsselwörter extrahiert werden, bedeutet dies nicht, dass die Seite tatsächlich für diese Schlüsselwörter rangiert. Die endgültige Entscheidung darüber, für welche Schlüsselwörter eine Webseite rangiert, liegt bei der Suchmaschine. - -Das folgende Beispiel gibt eine Liste aller aus der Webseite extrahierten Keywords zurück: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -// Navigation zur Testseite. -// Diese enthält 3 Absätze aus dem englischen Wikipedia-Artikel zu "lorem ipsum". -$web->go('https://test-pages.phpscraper.de/content/keywords.html'); - -// Überprüfen der Anzahl der Schlüsselwörter. -$keywords = $web->contentKeywords; -echo "Diese Seite enthält mindestens" . count($keywords) . " Schlüsselwörter/Phrasen.\n\n"; - -// Schleife durch die Schlüsselwörter -foreach ($keywords as $keyword) { - echo " - " . $keyword . "\n"; -} - -/** - * Ausgegeben wird: - * - * Diese Seite enthält mindestens 40 Schlüsselwörter/Phrasen. - * - * [...] - * - graphic - * - improper latin - * - introduced - * - keyword extraction tests - * - letraset transfer sheets - * - lorem ipsum - * - lorem ipsum php rake library lorem ipsum - * - lorem ipsum text - * - make - * - malorum - * - microsoft word - * - mid-1980s - * - nonsensical - * - page - * - paragraphs - * - philosopher cicero - * - php rake library - * - popular word processors including pages - * - popularized - * - removed - * - roman statesman - * - source - * [...] - */ -``` - -::: tip Tipp -Die Standardsprache (Gebietsschema) hierfür ist "en_US". Andere Sprachen, wie Deutsch, können als Parameter übergeben werden. Dies funktioniert derzeit nur für eine Auswahl von Sprachen. Weitere Informationen finden Sie in dieser [list](https://github.com/Donatello-za/rake-php-plus#currently-supported-languages). -::: - - -## Bewertung von Schlüsselwörtern - -Nicht jedes Keyword hat in den Ranking-Algorithmen der Suchmaschinen das gleiche Gewicht. Ein Mix aus verschiedenen Faktoren und SEO-Signalen entscheidet über die Gewichtung, die eine Suchmaschine einem Wort zuweist. Häufigkeit der Wörter, Länge der Texte und Variationen wie Synonyme können zu einer unterschiedlichen Gewichtung führen. - -PHPScraper ermöglicht es Ihnen, einen Hinweis auf die Gewichtung der Keywords in Form von Scores zu erhalten: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -// Navigation zur Testseite. -// Diese enthält 3 Absätze aus dem englischen Wikipedia-Artikel zu "lorem ipsum". -$web->go('https://test-pages.phpscraper.de/content/keywords.html'); - -// Überprüfen der Anzahl der Schlüsselwörter. -$keywords = $web->contentKeywordsWithScores; -echo "Diese Seite enthält mindestens " . count($keywords) . " Schlüsselwörter/Phrasen.\n\n"; - -// Schleife durch die Schlüsselwörter -foreach ($keywords as $keyword => $score) { - echo sprintf(" - %s (%s)\n", $keyword, $score); -} - -/** - * Ausgegeben wird: - * - * Diese Seite enthält mindestens 40 Schlüsselwörter/Phrasen. - * - * [...] - * - 1960s (1.0) - * - added (1.0) - * - adopted lorem ipsum (11.0) - * - advertisements (1.0) - * - aldus employed (4.0) - * - corrupted version (4.0) - * - graphic (1.0) - * - improper latin (4.0) - * - introduced (1.0) - * - keyword extraction tests (9.0) - * - test (1.0) - * - microsoft word (5.3333333333333) - * - english wikipedia (4.0) - * - lorem ipsum (8.0) - * - lorem ipsum text (11.0) - * [...] - */ -``` - -::: tip Tipp -Die PHP-Funktionen [similar_text](https://www.php.net/manual/en/function.similar-text.php) und [levenshtein](https://www.php.net/manual/en/function.levenshtein.php) können Ihnen helfen, ähnliche Schlüsselwörter sowie Tippfehler-Varianten von Schlüsselwörtern zu identifizieren und zusammenzuführen. [Keyword Merge](https://github.com/spekulatius/keyword-merge) ist ein Composer-Paket, das beim Aussortieren ähnlicher Schlüsselwörter hilft. -::: diff --git a/websites/de/examples/headings.md b/websites/de/examples/headings.md deleted file mode 100644 index 3fbf9fb..0000000 --- a/websites/de/examples/headings.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -image: https://api.imageee.com/bold?text=PHP:%20Scraping%20Headings&bg_image=https://images.unsplash.com/photo-1542762933-ab3502717ce7 ---- - -# Scrapen von Überschriften - -Überschriften können nützlich sein, um sich einen Überblick über den Inhalt einer Website zu verschaffen. Das folgende Beispiel zeigt, wie man scrapen kann: - - - Eine einzelne Überschrift - - Alle Überschriften einer bestimmten Ebene (z.B. `

`) - - Alle Überschriften auf einer Seite - - -## Einzelne Überschrift Scrapen - -Das Einscannen einer einzelnen Überschrift ist einfach und kann anhand dieses Beispiels durchgeführt werden: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -/** - * Navigation zur Testseite. Diese enthält: - * - * Outline Test - */ -$web->go('https://test-pages.phpscraper.de/content/online.html'); - -// Ausgeben der H1-Überschrift -echo $web->h1[0]; // "Outline Test" -``` - -::: tip -Der [Website-Titel](/de/examples/scrape-website-title.html) und die Überschrift 1 (`

`) können unterschiedlich sein. Stellen Sie sicher, dass Sie die richtige abrufen. -::: - - -## Rubriken nach Ebene - -Es kann Fälle geben, die Überschriften einer bestimmten Ebene abgerufen werden sollen. Das folgende Beispiel zeigt, wie dies möglich ist: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -/** - * Navigation zur Testseite. Diese enthält: - * - *

Example 1

- *

Here would be an example.

- * - *

Example 2

- *

Here would be the second example.

- * - *

Example 3

- *

Here would be another example.

- */ -$web->go('https://test-pages.phpscraper.de/content/online.html'); - -/** - * Gibt die h3-Überschriften zurück: - * - * [ - * 'Example 1', - * 'Example 2', - * 'Example 3' - * ] - */ -$web->h3; -``` - -Wenn keine Überschriften gefunden werden, bleibt das Feld leer. - - -## Alle Überschriften auf einer Seite - -Um auf alle Rubriken einer Seite zuzugreifen, können Sie die verschiedenen Ebenen von 1 bis 6 anwählen. Alternativ können Sie auch alle auf einmal aufrufen: - - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -/** - * Navigation zur Testseite. Diese Seite enthält: - * - *

We are testing here!

- *

This page contains an example structure to be parsed. It comes with a number of headings and nested paragraphs as an scrape example.

- * - *

Examples

- *

There are numerous examples on the website. Please check them out to get more context on how scraping works.

- * - *

Example 1

- *

Here would be an example.

- * - *

Example 2

- *

Here would be the second example.

- * - *

Example 3

- *

Here would be another example.

- */ -$web->go('https://test-pages.phpscraper.de/content/online.html'); - -/** - * $headings enthält jetzt: - * - * [ - * [ - * 'We are testing here!' - * ], - * [ - * 'Examples' - * ], - * [ - * 'Example 1', - * 'Example 2', - * 'Example 3', - * ], - * [], - * [], - * [] - * ] - */ -$web->headings; -``` - -Wie Sie sehen können, enthält dies keine Informationen über die Struktur der Überschriften. Es geht nur darum zu wissen, welche Überschriften vorhanden sind. Wenn Sie eine [Gliederung](/de/examples/outline.html) haben möchten, müssen Sie die entsprechenden Methoden verwenden. diff --git a/websites/de/examples/lists.md b/websites/de/examples/lists.md deleted file mode 100644 index 4c02716..0000000 --- a/websites/de/examples/lists.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -image: https://api.imageee.com/bold?text=PHP:%20Scraping%20Lists&bg_image=https://images.unsplash.com/photo-1542762933-ab3502717ce7 ---- - -# Listen Scrapen - -Das Scraping von Listen folgt einem ähnlichen Ansatz wie anderes Scraping mit PHPScraper: - -```php -$web = new \Spekulatius\PHPScraper\PHPScraper; - -/** - * Navigation zur Testseite. Diese Seite enthält: - * - *

Example 1: Unordered List

- * - * - *

Example 2: Ordered List

- *
    - *
  1. Ordered list item 1
  2. - *
  3. Ordered list item 2
  4. - *
  5. Ordered list item with HTML
  6. - *
- */ -$web->go('https://test-pages.phpscraper.de/content/lists.html'); - -/** - * Nur unsortierte Listen (