# LilySurfaceScraper turns a texture page URL into a Blender material

> LilySurfaceScraper is a Blender add-on that scrapes a texture or HDRI page, downloads the maps and builds the PBR material, so the same URL workflow works across cgbookcase, ambientCG, Poly Haven and Textures.one. It suits a 3D artist who wants one import path rather than one add-on per library, and it breaks whenever a source site changes its page layout.

**eliemichel/LilySurfaceScraper** — Import shaders end environments in Blender from a single URL

- Repository: https://github.com/eliemichel/LilySurfaceScraper
- Stars: 626 · Forks: 61
- Language: Cython
- License: NOASSERTION
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/eliemichel-lilysurfacescraper

## The problem is not finding textures, it is wiring them up

There are many sources for PBR textures on the internet, and the author's framing of the problem is precise: the tedious part is not the search, it is the repetitive setup of the shader once the textures are in hand.

Some sites ship their own add-on to handle that setup. The complaint is that it stays painful to install a new add-on for every site, and that each one differs slightly from the others, so you have to relearn the workflow with every new library.

LilySurfaceScraper's answer is to make the site irrelevant. You browse your favourite library in your browser, copy the URL of the page you want, and paste it into Blender. The add-on prompts for potential variants when it detects more than one, downloads the maps and sets up the material.

So the scope is narrower than it might sound. This is not a search engine for textures and not a viewer. It is a replacement for the per-site import add-ons, unified behind one URL-based flow. The user is an artist who already knows which library they like and wants the setup step to stop repeating itself.

## One add-on, several sources, and the same workflow throughout

The supported sources are listed by asset type, which shows that the add-on covers more than flat colour maps.

Materials come from cgbookcase, ambientCG, Poly Haven Texture, the local filesystem, and Textures.one. Worlds come from Poly Haven HDRIs and from Textures.one. Lights come from the ies library.

The local filesystem entry is interesting because it turns the add-on into a general material builder: if the URL points at a file on your own disk, the same variant prompt and setup path applies.

Textures.one gets special treatment. If the URL contains just words with no slash, those words are used as search keywords, and a result is picked at random from that site. You can also do the search yourself and hand over a link to the result page instead, provided the link points at a supported texture site.

That keyword behaviour is a shortcut with a rough edge. A random pick from a keyword search is not a reproducible choice, and if you need a specific asset in a specific version, the manual route of searching and pasting the result URL is the one that keeps a record in your scene.

## Installing a zip into Blender preferences

Installation is a manual add-on install rather than a package manager entry.

You download the latest release from the project's releases page, then in Blender you go to Edit, then Preferences, then Add-on, then Install, and browse to the zip file. After that you have to tick the small checkbox next to "Import: Lily Surface Scraper", because the add-on stays inactive until you do.

That checkbox step is the kind of detail that catches people out. The install succeeds, the add-on appears in the list, and nothing happens until it is enabled.

There is one preference that matters for how the add-on behaves afterwards: a path to your texture library. If the path is absolute, such as C:\Users\Suzanne\Pictures, you do not have to save your blend files before using the add-on. If the path is relative, like image-textures\lily, the add-on searches for a folder named image-textures next to your .blend file and stores the textures inside image-textures in a subfolder named lily.

So the relative path is the portable option, and it ties the texture folder to the project file. The absolute path is the convenient option when you work on one machine, and it is the reason the add-on complains when you open the material properties panel on an unsaved file.

## The import flow, step by step

The documented workflow is short enough to memorise.

Open the material properties panel. If you see a message telling you to save your file first, or to set an absolute path for your textures, that is the path configuration from the preferences biting. Then browse one of the supported websites until you find a texture, for example a page on cc0textures.com. Copy the URL.

Then you have two ways in. Click Import from Clipboard to bring it in instantly, or click Import Surface and paste the URL you just copied.

If the page offers more than one variant, you select which one you want. After that the textures download and the material is set up, which takes a few seconds depending on the resolution and your connection.

Two details are worth knowing. The textures are not downloaded twice if you use the same URL and variant again, so a repeated import is cheap and does not duplicate files on disk. And the same process is available in the World panel, so HDRIs are imported the same way as materials.

## Adding a source means adding one Python file

The extensibility story is the most developer-interesting part of the project, and it is deliberately small.

Adding a new source means adding a Python file in the Scrapers/ directory and defining a class that derives from AbstractScraper. The add-on detects the file automatically, so there is no registry to edit. The documentation suggests starting from a copy of AmbientCgScraper.py or CgbookcaseScraper.py, and it explains that the two differ in a meaningful way: the first loads a zip and extracts the maps from it, while the second looks for a different URL for each map, such as base color and normal.

That is the whole extension contract, at least as far as the README describes it. Three methods are required, and the README section on new sources is cut off before listing them, so the exact signatures are something you read from the two example scrapers rather than from a specification.

The author suggests contributing fixes for broken sources directly, saying the changes should be fairly easy to make. The troubleshooting section makes the same point in practical terms: trouble is to be expected because source websites change their design, and the fix belongs in the repository rather than in a bug report to the texture site.

## Where it breaks: site markup, VPNs and the lxml problem

The troubleshooting section is unusually honest for a small add-on, and it names three specific failure modes.

First, Blender hanging forever during download. The advice is to disable your VPN, which suggests a network-level problem rather than a bug in the parsing.

Second, an import error for etree from lxml when activating the add-on. The author tried to bundle lxml into the add-on to avoid exactly this, but some users still hit it, and the documented workaround is to install lxml manually against the Python that ships inside your Blender installation, which means an administrator prompt on Windows.

```
    "C:\Program Files\Blender Foundation\Blender 3.1\3.1\python\bin\python.exe" -m pip install lxml -t "C:\Program Files\Blender Foundation\Blender 3.1\3.1\scripts\modules"
```

On macOS the equivalent targets the bundled interpreter inside the app bundle.

```
    /Applications/Blender.app/Content/Resources/3.4/python/bin/python -m pip install lxml -t /Applications/Blender.app/Content/Resources/3.4/scripts/modules
```

Third, the structural one. Scraping depends on the layout of a site you do not control, so any design change breaks the matching. The project treats this as expected and asks that issues be filed on its own repository rather than on the texture sites, which are not involved in the project.

## Version support and a licence you have to read

The version policy is stated in the news line. From version 1.9.0, Blender versions strictly older than 4.1 are no longer supported, and the documentation points you at 1.8.1 for Blender 2.83 through 4.0.

That is the compatibility boundary to plan around. The releases listed are 1.9.0 dated 2024-04-07, 1.8.1 from 2022-10-12, and an 8.0 release candidate from 2022-03-31. The repository is not archived and the last push was on 2026-06-19, so the code moves even though the release tags are old, which is typical for an add-on whose users install from the releases page rather than from a package index.

The licence is not one GitHub can classify, and the repository carries a LICENSE.md file, so if you use this at work you should read that file rather than assume a permissive default from the absence of a badge.

There is also a funding request at the top of the README asking for support if the add-on saves you time or money, linked to a PayPal donation. The project also links a video demonstration, a support thread on BlenderArtists, and an issue tracker where problems with the add-on itself should be reported.

## Conclusion

LilySurfaceScraper fits a Blender artist who pulls textures from several public libraries and wants a single paste-the-URL path instead of a separate add-on per site, with version 1.9.0 requiring Blender 4.1 or newer and 1.8.1 covering 2.83 through 4.0. It does not fit a pipeline that needs guaranteed scraping against sites that change their markup, and it does not fit a studio with a rights-cleared internal library, since the add-on is built around public texture sites. Before adopting it, check the source site's terms for the assets you import, set an absolute texture path in the add-on preferences so you do not have to save the blend file first, and test one import per source against your Blender version, since a layout change on a single site is the most likely reason an import will fail.

## FAQ

### How do I install LilySurfaceScraper in Blender?

Download the latest release zip, then in Blender go to Edit, Preferences, Add-on, Install and browse to the zip file. You also have to tick the checkbox next to "Import: Lily Surface Scraper" or the add-on stays inactive.

### Which Blender versions does LilySurfaceScraper support?

Since version 1.9.0, released 2024-04-07, Blender versions strictly older than 4.1 are no longer supported. For Blender 2.83 through 4.0 the documentation points you at version 1.8.1 of the add-on.

### Which texture sources does LilySurfaceScraper support?

Materials from cgbookcase, ambientCG, Poly Haven Texture, the local filesystem and Textures.one. Worlds from Poly Haven HDRIs and Textures.one, and lights from the ies library.

### How do I add a new texture source to LilySurfaceScraper?

Add a Python file in the Scrapers/ directory that defines a class deriving from AbstractScraper. The add-on detects it automatically, and the documentation suggests starting from a copy of AmbientCgScraper.py or CgbookcaseScraper.py.

## Sources

- [eliemichel/LilySurfaceScraper on GitHub](https://github.com/eliemichel/LilySurfaceScraper)
- [Issues](https://github.com/eliemichel/LilySurfaceScraper/issues)
- [README](https://github.com/eliemichel/LilySurfaceScraper/blob/master/README.md)
- [Releases](https://github.com/eliemichel/LilySurfaceScraper/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/eliemichel-lilysurfacescraper
