{"id":20709933,"url":"https://github.com/oxylabs/browser-instructions","last_synced_at":"2026-02-14T05:05:55.049Z","repository":{"id":208583274,"uuid":"721701954","full_name":"oxylabs/browser-instructions","owner":"oxylabs","description":"Browser instructions enable users to execute various Oxylabs' headless browser actions, like clicking, inputting, scrolling, waiting, and fetching resources.","archived":false,"fork":false,"pushed_at":"2025-06-26T08:22:34.000Z","size":3683,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-14T07:41:29.471Z","etag":null,"topics":["browser-action","browser-api","browser-automation","scraper","scraper-api","web-scraping"],"latest_commit_sha":null,"homepage":"https://oxylabs.io/features/headless-browser","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oxylabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-11-21T15:45:33.000Z","updated_at":"2025-06-26T08:22:37.000Z","dependencies_parsed_at":"2025-02-11T14:24:01.730Z","dependency_job_id":"272459cf-284a-4e07-bef6-34d714b22d71","html_url":"https://github.com/oxylabs/browser-instructions","commit_stats":null,"previous_names":["oxylabs/browser-instructions"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oxylabs/browser-instructions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxylabs%2Fbrowser-instructions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxylabs%2Fbrowser-instructions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxylabs%2Fbrowser-instructions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxylabs%2Fbrowser-instructions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oxylabs","download_url":"https://codeload.github.com/oxylabs/browser-instructions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxylabs%2Fbrowser-instructions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29437368,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T03:34:37.767Z","status":"ssl_error","status_checked_at":"2026-02-14T03:34:09.092Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-action","browser-api","browser-automation","scraper","scraper-api","web-scraping"],"created_at":"2024-11-17T02:09:06.880Z","updated_at":"2026-02-14T05:05:55.037Z","avatar_url":"https://github.com/oxylabs.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# How to Use Browser Instructions for Web Scraping\n\n[![Oxylabs promo code](https://raw.githubusercontent.com/oxylabs/product-integrations/refs/heads/master/Affiliate-Universal-1090x275.png)](https://oxylabs.io/pages/gitoxy?utm_source=877\u0026utm_medium=affiliate\u0026groupid=877\u0026utm_content=browser-instructions-github\u0026transaction_id=102f49063ab94276ae8f116d224b67)\n\n[![](https://dcbadge.limes.pink/api/server/Pds3gBmKMH?style=for-the-badge\u0026theme=discord)](https://discord.gg/Pds3gBmKMH) [![YouTube](https://img.shields.io/badge/YouTube-Oxylabs-red?style=for-the-badge\u0026logo=youtube\u0026logoColor=white)](https://www.youtube.com/@oxylabs)\n\n- [General tips](#general-tips)\n- [Structuring instructions for Web Scraper API and Web Unblocker](#structuring-instructions-for-web-scraper-api-and-web-unblocker)\n  * [Installing libraries](#installing-libraries)\n  * [Web Unblocker](#web-unblocker)\n  * [Web Scraper API](#web-scraper-api)\n- [Postpone execution or wait for elements](#postpone-execution-or-wait-for-elements)\n  * [Wait for an element to load](#wait-for-an-element-to-load)\n  * [Wait](#wait)\n- [Click on elements](#click-on-elements)\n- [Fill in text in fields](#fill-in-text-in-fields)\n- [Scroll pages](#scroll-pages)\n  * [Scroll by pixel](#scroll-by-pixel)\n  * [Scroll to the bottom](#scroll-to-the-bottom)\n- [Fetch browser resources](#fetch-browser-resources)\n\nBrowser instructions are a feature of Oxylabs’ [\u003cu\u003e Wev Scraper\nAPI\u003c/u\u003e](https://oxylabs.io/products/scraper-api/web) solution and [\u003cu\u003eWeb\nUnblocker\u003c/u\u003e](https://oxylabs.io/products/web-unblocker), enabling\nusers to interact with a web page when using a headless browser. For\ninstance, you can tell the headless browser to scroll down to the bottom\nof the page, click on a specific element, enter text into a specific\nfield, and much more. As a result, your scraping operations will be\nbetter equipped to handle various page interactions without using\nthird-party tools like Selenium or Puppeteer.\n\nFollow this guide to learn how to form browser instructions and see them\napplied when scraping popular e-commerce and travel aggregation\nwebsites.\n\n## General tips\n\nBefore writing custom browser instructions, you should explore your\ntarget web page and navigate through each step you want the browser to\nmake. Take notice of any peculiarities, like longer loading times or\nunexpected page refreshes, that may affect how the headless browser sees\nthe page and, thus, its ability to interact with desired elements.\n\nAfter sending a request to Web Scraper API or Web Unblocker, it’s best\nto check the output for any interaction errors to make sure that every\nbrowser instruction was completed successfully. In cases where\ninstructions fail, you may find it helpful to retrieve a [\u003cu\u003ePNG\nscreenshot\u003c/u\u003e](https://developers.oxylabs.io/scraper-apis/web-scraper-api/features/javascript-rendering#png-screenshot)\nof the result, which will let you see what the headless browser is\ndealing with. For better control when handling failures, you can use the\n[\u003cu\u003eon_error\u003c/u\u003e](https://developers.oxylabs.io/scraper-apis/web-scraper-api/features/browser-instructions/list-of-instructions#on_error)\nparameter to specify whether browser instructions should be stopped\nentirely or continue with the next instruction on error.\n\nYou can use XPath and CSS selectors to select elements or use text to\neasily target elements with a certain text value. If you need a\nrefresher on how to form selectors, see this blog post on [\u003cu\u003eXPath vs.\nCSS\u003c/u\u003e](https://oxylabs.io/blog/xpath-vs-css). To quickly test out your\nXPath and CSS selectors, you can use the **Developer Tools** \\\u003e\n**Elements** tab, open the search bar, and paste your selector:\n\n![](/images/dev_tools.png)\n\nOxylabs\ndocumentation for [\u003cu\u003eWeb Unblocker\u003c/u\u003e](https://developers.oxylabs.io/advanced-proxy-solutions/web-unblocker/headless-browser/browser-instructions-beta) and [\u003cu\u003eWeb Scraper API\u003c/u\u003e](https://developers.oxylabs.io/scraper-apis/web-scraper-api/features/browser-instructions)\nis the go-to resource for all the available parameters, so keep it open\nfor a quick reference.\n\n## Structuring instructions for Web Scraper API and Web Unblocker\n\nThe process of creating browser instructions for Web Scraper API and Web\nUnblocker differs slightly, and we'll explore these variances below to\nmake it clearer for you. So, using this [\u003cu\u003eOxylabs’\nSandbox\u003c/u\u003e](https://sandbox.oxylabs.io/products) page, let’s instruct\nthe browser to click the first product listing and scrape it:\n\n![](/images/sandbox.png)\n\n### Installing libraries\n\nBegin by installing the `requests` module that we'll use to make requests to Web Unblocker endpoint and the API. Open the terminal in your IDE and run this line:\n\n```bash\npip install requests\n```\nDepending on your setup, you may want to use the `pip3` keyword instead:\n\n```bash\npip3 install requests\n```\n\n### Web Unblocker\n\nWhen using Web Unblocker, you must define browser instructions as a\nvalue of the `X-Oxylabs-Browser-Instructions` header after providing the\n`\"X-Oxylabs-Render\": \"html\"` header.\n\nThere are several ways you can form your instructions, the first one\nbeing a single JSON line:\n\n```python\nimport requests\n\nproxies = {\n  \"http\": \"http://USERNAME:PASSWORD@unblock.oxylabs.io:60000\",\n  \"https\": \"https://USERNAME:PASSWORD@unblock.oxylabs.io:60000\"\n}\n\n\nheaders = {\n    \"X-Oxylabs-Render\": \"html\",\n    \"X-Oxylabs-Browser-Instructions\": '''[{\"type\":\"click\",\"selector\":{\"type\":\"xpath\",\"value\":\"//h4[@class='title css-7u5e79 eag3qlw7']\"}},{\"type\":\"wait\",\"wait_time_s\":3}]'''\n}\n\nresponse = requests.get(\n    \"https://sandbox.oxylabs.io/products\",\n    verify=False,  # It's required to ignore the certificate\n    proxies=proxies,\n    headers=headers\n)\n\nprint(response.text)\n```\n\nWe recommend providing instructions in **escaped JSON** format and without\nempty spaces to ensure proper parsing and interpretation by our API. For\nmanual testing, you can escape a JSON string manually or by using\n[\u003cu\u003eonline tools\u003c/u\u003e](https://www.freeformatter.com/json-escape.html)\nand then provide the headers like so:\n\n```python\nheaders = {\n    \"X-Oxylabs-Render\": \"html\",\n    \"X-Oxylabs-Browser-Instructions\": '''[{\\\"type\\\":\\\"click\\\",\\\"selector\\\":{\\\"type\\\":\\\"xpath\\\",\\\"value\\\":\\\"\\/\\/h4[@class='title css-7u5e79 eag3qlw7']\\\"}},{\\\"type\\\":\\\"wait\\\",\\\"wait_time_s\\\":3}]'''\n}\n```\n\nAnother way, which is the only approach that’ll work in the full\nimplementation stage, is to import the `json` module and use the\n`json.dumps()` function to automatically escape JSON. This way, you can\nalso structure your instructions in a more readable way:\n\n```python\nheaders = {\n    \"X-Oxylabs-Render\": \"html\",\n    \"X-Oxylabs-Browser-Instructions\": json.dumps(\n        [\n            {\n                \"type\":\"click\",\n                \"selector\":{\n                    \"type\":\"xpath\",\n                    \"value\":\"//h4[@class='title css-7u5e79 eag3qlw7']\"\n                }\n            },\n            {\n                \"type\":\"wait\",\n                \"wait_time_s\":3\n            }\n        ]\n    )\n}\n```\n\n### Web Scraper API\n\nFor Web Scraper API, browser instructions must be paired with the\n`browser_instructions` key and included in the payload. These instructions\ncan be provided as a single line or spread out for improved readability:\n\n```python\nimport requests\nfrom pprint import pprint\n\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://sandbox.oxylabs.io/products\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"click\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"//h4[@class='title css-7u5e79 eag3qlw7']\"\n            }\n        },\n        {\n            \"type\": \"wait\",\n            \"wait_time_s\": 3\n        }\n    ]\n}\n\nresponse = requests.request(\n    \"POST\",\n    \"https://realtime.oxylabs.io/v1/queries\",\n    auth=(\"USERNAME\", \"PASSWORD\"),\n    json=payload\n)\n\npprint(response.json())\n```\n\nAs these differences are out of the way, let’s overview some real-life\nscraping scenarios where browser instructions can be used.\n\n## Postpone execution or wait for elements\n\n\u003csub\u003e*All information herein is provided on an “as is” basis and for\ninformational purposes only. We make no representation and disclaim all\nliability with respect to your use of any information contained on this\npage. Before engaging in scraping activities of any kind you should\nconsult your legal advisors and carefully read the particular website’s\nterms of service or receive a scraping license.*\u003c/sub\u003e\n\nAs the heading suggests, you can instruct the browser to wait a set\ncount of seconds explicitly. This is helpful in cases where you need to:\n\n- Handle lazy loading pages and elements;\n\n- Wait for a page to load fully;\n\n- Wait for elements or pop ups to load;\n\n- Imitate organic user behavior.\n\nConsider this [\u003cu\u003eWayfair product\npage\u003c/u\u003e](https://www.wayfair.com/furniture/pdp/ebern-designs-cidalino-83-upholstered-sleeper-sofa-chaise-with-storage-2-cup-holders-w100038905.html?piid=122444084)\nas an example. When you visit this page, the full price, the discounted\nprice, and the shipping information take quite a while to load:\n\n![](/images/wayfair.png)\n\n### Wait for an element to load\n\nUse the `wait_for_element` parameter when you only need to wait for a\nspecific element to load, as is the case with this Wayfair page. As a\nresult, you’ll save time by making your scraping process as short as it\ncan be.\n\nYou can specify the element by providing its **XPath** or **CSS** selector or\nits **textual** value. See this snippet below, where the `timeout_s` parameter\ninstructs the browser to terminate the action if the element doesn’t\nload after 5 seconds:\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.wayfair.com/furniture/pdp/ebern-designs-cidalino-83-upholstered-sleeper-sofa-chaise-with-storage-2-cup-holders-w100038905.html\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"wait_for_element\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"//div[@data-enzyme-id='PriceBlock']\"\n            },\n            \"timeout_s\": 7\n        }\n    ]\n}\n```\n\nNote how, in this example, the `timeout_s` parameter goes after the\nselector parameter. You may also combine the `wait_time_s` and `on_error`\nparameters in the same manner if you want to include them.\n\n### Wait\n\nThe `wait` command directs the browser to pause the execution of further\ninstructions until the specified duration has passed. This parameter has\nmany uses, one of which can be to simply wait for a page to load\ncompletely. Let’s use the previous Wayfair page as an example:\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.wayfair.com/furniture/pdp/ebern-designs-cidalino-83-upholstered-sleeper-sofa-chaise-with-storage-2-cup-holders-w100038905.html\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"wait\",\n            \"wait_time_s\": 7\n        }\n    ]\n}\n```\n\n## Click on elements\n\nSimply put, by clicking on specific elements, you can access the data\nyou need that’s not visible in the initial HTML. There are countless\nways you can use the `click` instruction, primarily enabling you to:\n\n- Load dynamic content;\n\n- Handle various pop-ups and alerts;\n\n- Navigate websites like a real user.\n\nLet’s use this [\u003cu\u003eTrivago search\npage\u003c/u\u003e](https://www.trivago.com/en-US/lm/hotels-los-angeles-california?search=200-14257)\nas an example. When you scrape this page without browser instructions,\nyou aren’t able to retrieve all available deals for a listing without\nclicking the hotel name and then clicking “Show all prices”:\n\n![](/images/trivago.png)\n\n![](/images/trivago_show_prices.png)\n\nIn this scenario, you can tell the browser to click the hotel name and\nthe button and wait a few seconds to load the data:\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.trivago.com/en-US/lm/hotels-los-angeles-california?search=200-14257\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"click\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"(//button[@data-testid='item-name'])[2]\"\n            },\n            \"wait_time_s\": 3\n        },\n        {\n            \"type\": \"click\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"//button[@data-testid='show-more-deals-button']\"\n            },\n            \"wait_time_s\": 3\n        }\n    ]\n}\n```\n\n## Fill in text in fields\n\nThe `input` parameter is handy in situations where you need to enter\nspecific information into a field. With it, you can perform various\ninput actions, like:\n\n- Access content that requires you to enter a text;\n\n- Navigate websites;\n\n- Fill in forms.\n\nBelow, you can see a [\u003cu\u003eBest Buy listing\npage\u003c/u\u003e](https://www.bestbuy.com/site/searchpage.jsp?st=backpack),\nwhere you can enter a ZIP code to see customized delivery information.\nHence, you can instruct the browser to:\n\n1.  **Click** the delivery ZIP code;\n\n    - Wait for the element to load;\n\n2.  **Enter** “11238” into the input field;\n\n3.  **Click** “Update”;\n\n    - Wait for the page to reload.\n\n![](/images/best_buy.png)\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.bestbuy.com/site/searchpage.jsp?st=backpack\",\n    \"geo_location\": \"United States\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"click\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"//div[@style='text-align: left;']\"\n            },\n            \"wait_time_s\": 1\n        },\n        {\n            \"type\": \"input\",\n            \"value\": \"11238\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"//input[@placeholder='ZIP or City, State']\"\n            }\n        },\n        {\n            \"type\": \"click\",\n            \"selector\": {\n                \"type\": \"xpath\",\n                \"value\": \"//button[@data-track='Delivery Location Modal: Update Button']\"\n            },\n            \"wait_time_s\": 5\n        }\n    ]\n}\n```\n\n## Scroll pages\n\nYou can scroll pages by using two different parameters, in the end\ngiving you the ability to:\n\n- Load all content by overcoming lazy loading elements;\n\n- Mimic organic user interaction.\n\n### Scroll by pixel\n\nThe `scroll` instruction grants you complete control over the browser's\nscrolling ability, enabling precise navigation in all directions\n(left-right and up-down) pixel by pixel.\n\n\u003e [!NOTE]\n\u003e To scroll up, use a negative value, for instance `-100`.\n\nFor this example, let’s use the [\u003cu\u003eAliexpress\nhomepage\u003c/u\u003e](https://www.aliexpress.us/), as it has several sections\nthat load only when you scroll to them.\n\nTo estimate how many pixels it would take to scroll the page to a\ncertain section, you can use your browser’s Developer Tools and run a\nJavaScript code. Open the **Dev Tools**, head to the **Console** tab,\nand execute this line, which will scroll down by `500` pixels:\n\n```javascript\nwindow.scrollBy(0, 500)\n```\n\nAlternatively, you can simply scroll the page manually to the desired\nsection and then run the below code to output the amount of pixels\nyou’ve scrolled from the top:\n\n```javascript\nvar scrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconsole.log(scrollTop)\n```\n\nAs the Aliexpress homepage has lazy loading sections, you’ll only be\nable to scrape a total of 30 products under the _“More to love”_ section\nwithout using browser instructions. After scrolling down and triggering\nthe first lazy loading section – there will be a total of 60 products\navailable. So, using this logic, you can control how many listings\nyou’ll scrape.\n\nSay you want to retrieve 60 products in total. You can instruct the\nbrowser to scroll down a number of pixels, in this case, `4115` pixels, to\ntrigger the first lazy loading section and load 30 more items:\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.aliexpress.us/\",\n    \"geo_location\": \"United States\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"scroll\",\n            \"x\": 0,\n            \"y\": 4115,\n            \"wait_time_s\": 5\n        }\n    ]\n}\n```\n\n### Scroll to the bottom\n\nWhen you use the `scroll_to_bottom` instruction, the browser will scroll\ndown to the bottom of the page. We can target this [\u003cu\u003eAliexpress\nproduct page\u003c/u\u003e](https://www.aliexpress.us/item/3256805956826539.html)\nas it has related products at the bottom that load only when you scroll\nto this section:\n\n![](/images/aliexpress.png)\n\nLet’s say your goal is to scrape these related products. You can\ninstruct the browser to scroll to the bottom and give it some time to\nload these elements:\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.aliexpress.us/item/3256805956826539.html\",\n    \"geo_location\": \"United States\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"scroll_to_bottom\",\n            \"wait_time_s\": 2\n        }\n    ]\n}\n```\n\n## Fetch browser resources\n\nWith the `fetch_browser` parameter, you can retrieve the first occurrence\nof a Fetch/XHR resource that matches a specified pattern. In essence, it\nenables you to:\n\n- Fetch data straight from a resource;\n\n- Get structured data if the resource has it structured;\n\n- Get only the data you need instead of dealing with the entire HTML document.\n\nLet’s illustrate this functionality by using this [\u003cu\u003eZillow search\npage\u003c/u\u003e](https://www.zillow.com/ny/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22isMapVisible%22%3Atrue%2C%22mapBounds%22%3A%7B%22west%22%3A-106.09230612499996%2C%22east%22%3A-45.44777487499997%2C%22south%22%3A33.66133888602103%2C%22north%22%3A50.74415717706928%7D%2C%22mapZoom%22%3A4%2C%22usersSearchTerm%22%3A%22NY%22%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A43%2C%22regionType%22%3A2%7D%5D%2C%22filterState%22%3A%7B%22sort%22%3A%7B%22value%22%3A%22globalrelevanceex%22%7D%2C%22ah%22%3A%7B%22value%22%3Atrue%7D%7D%2C%22isListVisible%22%3Atrue%7D).\nLooking at the **Dev** **Tools** \\\u003e **Network** \\\u003e **Response** tab, you\ncan see that the `async-create-search-page-state` resource has all the\nlistings neatly structured in JSON format:\n\n![](/images/fetch_zillow.png)\n\n![](/images/fetch_json.png)\n\nYou can extract the full JSON file by specifying the URL of this\nresource in browser instructions. Note, that the `filter` parameter values\nmust be formatted as regular expressions (regex). Furthermore, you may\nwant to transform the URL into a regular expression that matches\ndifferent URL variations and doesn’t break with minor changes of the API\nendpoint.\n\n```python\npayload = {\n    \"source\": \"universal\",\n    \"url\": \"https://www.zillow.com/ny/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22isMapVisible%22%3Atrue%2C%22mapBounds%22%3A%7B%22west%22%3A-106.09230612499996%2C%22east%22%3A-45.44777487499997%2C%22south%22%3A33.66133888602103%2C%22north%22%3A50.74415717706928%7D%2C%22mapZoom%22%3A4%2C%22usersSearchTerm%22%3A%22NY%22%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A43%2C%22regionType%22%3A2%7D%5D%2C%22filterState%22%3A%7B%22sort%22%3A%7B%22value%22%3A%22globalrelevanceex%22%7D%2C%22ah%22%3A%7B%22value%22%3Atrue%7D%7D%2C%22isListVisible%22%3Atrue%7D\",\n    \"render\": \"html\",\n    \"browser_instructions\": [\n        {\n            \"type\": \"fetch_resource\",\n            \"filter\": \"https://www.zillow.com/async-create-search-page-state\"\n        }\n    ]\n}\n```\n\nThis article focuses on the basics of forming and using browser\ninstructions with our Web Scraper API and Web Unblocker. So, take your time\nto play around and see what works best for your target websites. As\nalways, if you have any questions, don’t hesitate to contact our 24/7\nsupport team via [\u003cu\u003elive chat\u003c/u\u003e](https://oxylabs.io/) or\n[\u003cu\u003eemail\u003c/u\u003e](mailto:support@oxylabs.io).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxylabs%2Fbrowser-instructions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foxylabs%2Fbrowser-instructions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxylabs%2Fbrowser-instructions/lists"}