Last active
November 19, 2024 14:43
-
-
Save MartinMReed/ae81f1aea0d5a9ce363658cf675f0ba3 to your computer and use it in GitHub Desktop.
Maze Generator Scraper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| Scrape mazes generated by https://mazegenerator.net and save to pdf | |
| """ | |
| import os | |
| import re | |
| import time | |
| import traceback | |
| from math import floor | |
| import requests | |
| maze_no = 1 | |
| level_min = 8 | |
| level_max = 32 | |
| used_rec_spec = [] | |
| def execute(): | |
| cookie = None | |
| initial_load_r = requests.get('https://mazegenerator.net') | |
| for shape in [1, 2, 3, 4]: | |
| shape_load_r = requests.post( | |
| url='https://mazegenerator.net', | |
| headers={ | |
| 'Cookie': cookie, | |
| }, | |
| data={ | |
| '__EVENTTARGET': 'ShapeDropDownList', | |
| '__EVENTARGUMENT': scrape_input('__EVENTARGUMENT', initial_load_r), | |
| '__LASTFOCUS': scrape_input('__LASTFOCUS', initial_load_r), | |
| '__VIEWSTATE': scrape_input('__VIEWSTATE', initial_load_r), | |
| '__VIEWSTATEGENERATOR': scrape_input('__VIEWSTATEGENERATOR', initial_load_r), | |
| '__EVENTVALIDATION': scrape_input('__EVENTVALIDATION', initial_load_r), | |
| 'ShapeDropDownList': shape, | |
| } | |
| ) | |
| shape_load_r.raise_for_status() | |
| if cookie is None and 'Set-Cookie' in shape_load_r.headers: | |
| cookie = shape_load_r.headers['Set-Cookie'].split(';')[0].strip() | |
| for size in range(level_min, level_max + 1, 1): | |
| iter_shape_params = iter_shape_params_1 | |
| if shape == 2: iter_shape_params = iter_shape_params_2 | |
| if shape == 3: iter_shape_params = iter_shape_params_3 | |
| if shape == 4: iter_shape_params = iter_shape_params_4 | |
| for filename, shape_params in iter_shape_params(size): | |
| form_post_r = requests.post( | |
| url='https://mazegenerator.net', | |
| headers={ | |
| 'Cookie': cookie, | |
| }, | |
| data={ | |
| '__EVENTTARGET': scrape_input('__EVENTTARGET', shape_load_r), | |
| '__EVENTARGUMENT': scrape_input('__EVENTARGUMENT', shape_load_r), | |
| '__LASTFOCUS': scrape_input('__LASTFOCUS', shape_load_r), | |
| '__VIEWSTATE': scrape_input('__VIEWSTATE', shape_load_r), | |
| '__VIEWSTATEGENERATOR': scrape_input('__VIEWSTATEGENERATOR', shape_load_r), | |
| '__EVENTVALIDATION': scrape_input('__EVENTVALIDATION', shape_load_r), | |
| 'ShapeDropDownList': shape, | |
| **shape_params, | |
| 'AlgorithmParameter1TextBox': 50, | |
| 'AlgorithmParameter2TextBox': 100, | |
| 'GenerateButton': 'Generate', | |
| } | |
| ) | |
| form_post_r.raise_for_status() | |
| if cookie is None and 'Set-Cookie' in form_post_r.headers: | |
| cookie = form_post_r.headers['Set-Cookie'].split(';')[0].strip() | |
| pdf_get_r = requests.get( | |
| url='https://mazegenerator.net/PdfGenerator.ashx', | |
| params={ | |
| 'Tag': re.search(rf'ImageGenerator.ashx\?Tag=(\d+)&', form_post_r.text).group(1), | |
| 'MazeType': 1, | |
| 'PageSize': 10, | |
| }, | |
| headers={ | |
| 'Cookie': cookie, | |
| } | |
| ) | |
| pdf_get_r.raise_for_status() | |
| os.makedirs('mazes/', exist_ok=True) | |
| with open(f'mazes/{filename}', 'wb') as f: | |
| f.write(pdf_get_r.content) | |
| print(filename) | |
| time.sleep(1) | |
| def iter_shape_params_1(size): | |
| global used_rec_spec | |
| for wx, hx in [(0.75, 1.00), (1.00, 0.75), (1.00, 1.00)]: | |
| width = min(max(floor(size * wx), 8), 200) | |
| height = min(max(floor(size * hx), 8), 200) | |
| if (width, height) in used_rec_spec: continue | |
| if wx != hx and abs(width - height) < 4: | |
| continue | |
| used_rec_spec.append((width, height)) | |
| for tesselation in [1, 2, 3]: | |
| yield f'maze-{next_maze_no():04}-1-{width:03}x{height:03}-{tesselation}.pdf', { | |
| 'S1TesselationDropDownList': tesselation, | |
| 'S1WidthTextBox': width, | |
| 'S1HeightTextBox': height, | |
| 'S1InnerWidthTextBox': 0, | |
| 'S1InnerHeightTextBox': 0, | |
| 'S1StartsAtDropDownList': 1, | |
| } | |
| def iter_shape_params_2(size): | |
| yield f'maze-{next_maze_no():04}-2-{size:03}.pdf', { | |
| 'S2OuterDiameterTextBox': size, | |
| 'S2InnerDiameterTextBox': 3, | |
| 'S2HorizontalBiasCheckBox': 'on', | |
| 'S2StartsAtDropDownList': 1, | |
| } | |
| def iter_shape_params_3(size): | |
| yield f'maze-{next_maze_no():04}-3-{size:03}.pdf', { | |
| 'S3SideLengthTextBox': size, | |
| 'S3InnerSideLengthTextBox': 0, | |
| 'S3StartsAtDropDownList': 1, | |
| } | |
| def iter_shape_params_4(size): | |
| for tesselation in [2, 3]: | |
| yield f'maze-{next_maze_no():04}-4-{size:03}-{tesselation}.pdf', { | |
| 'S4TesselationDropDownList': tesselation, | |
| 'S4SideLengthTextBox': size, | |
| 'S4InnerSideLengthTextBox': 0, | |
| 'S4StartsAtDropDownList': 1, | |
| } | |
| def scrape_input(id, response): | |
| match = re.search(rf'id="{id}" value="([^"]*)"', response.text) | |
| return match.group(1) if match else "" | |
| def next_maze_no(): | |
| global maze_no | |
| try: | |
| return maze_no | |
| finally: | |
| maze_no += 1 | |
| if __name__ == '__main__': | |
| try: | |
| execute() | |
| except Exception as e: | |
| traceback.print_exc() | |
| raise | |
| # OUTPUTS: | |
| # maze-0001-1-008x008-1.pdf | |
| # maze-0002-1-008x008-2.pdf | |
| # maze-0003-1-008x008-3.pdf | |
| # maze-0004-1-009x009-1.pdf | |
| # maze-0005-1-009x009-2.pdf | |
| # maze-0006-1-009x009-3.pdf | |
| # maze-0007-1-010x010-1.pdf | |
| # maze-0008-1-010x010-2.pdf | |
| # maze-0009-1-010x010-3.pdf | |
| # maze-0010-1-011x011-1.pdf | |
| # maze-0011-1-011x011-2.pdf | |
| # maze-0012-1-011x011-3.pdf | |
| # maze-0013-1-012x012-1.pdf | |
| # maze-0014-1-012x012-2.pdf | |
| # maze-0015-1-012x012-3.pdf | |
| # maze-0016-1-009x013-1.pdf | |
| # maze-0017-1-009x013-2.pdf | |
| # maze-0018-1-009x013-3.pdf | |
| # maze-0019-1-013x009-1.pdf | |
| # maze-0020-1-013x009-2.pdf | |
| # maze-0021-1-013x009-3.pdf | |
| # maze-0022-1-013x013-1.pdf | |
| # maze-0023-1-013x013-2.pdf | |
| # maze-0024-1-013x013-3.pdf | |
| # maze-0025-1-010x014-1.pdf | |
| # maze-0026-1-010x014-2.pdf | |
| # maze-0027-1-010x014-3.pdf | |
| # maze-0028-1-014x010-1.pdf | |
| # maze-0029-1-014x010-2.pdf | |
| # maze-0030-1-014x010-3.pdf | |
| # maze-0031-1-014x014-1.pdf | |
| # maze-0032-1-014x014-2.pdf | |
| # maze-0033-1-014x014-3.pdf | |
| # maze-0034-1-011x015-1.pdf | |
| # maze-0035-1-011x015-2.pdf | |
| # maze-0036-1-011x015-3.pdf | |
| # maze-0037-1-015x011-1.pdf | |
| # maze-0038-1-015x011-2.pdf | |
| # maze-0039-1-015x011-3.pdf | |
| # maze-0040-1-015x015-1.pdf | |
| # maze-0041-1-015x015-2.pdf | |
| # maze-0042-1-015x015-3.pdf | |
| # maze-0043-1-012x016-1.pdf | |
| # maze-0044-1-012x016-2.pdf | |
| # maze-0045-1-012x016-3.pdf | |
| # maze-0046-1-016x012-1.pdf | |
| # maze-0047-1-016x012-2.pdf | |
| # maze-0048-1-016x012-3.pdf | |
| # maze-0049-1-016x016-1.pdf | |
| # maze-0050-1-016x016-2.pdf | |
| # maze-0051-1-016x016-3.pdf | |
| # maze-0052-1-012x017-1.pdf | |
| # maze-0053-1-012x017-2.pdf | |
| # maze-0054-1-012x017-3.pdf | |
| # maze-0055-1-017x012-1.pdf | |
| # maze-0056-1-017x012-2.pdf | |
| # maze-0057-1-017x012-3.pdf | |
| # maze-0058-1-017x017-1.pdf | |
| # maze-0059-1-017x017-2.pdf | |
| # maze-0060-1-017x017-3.pdf | |
| # maze-0061-1-013x018-1.pdf | |
| # maze-0062-1-013x018-2.pdf | |
| # maze-0063-1-013x018-3.pdf | |
| # maze-0064-1-018x013-1.pdf | |
| # maze-0065-1-018x013-2.pdf | |
| # maze-0066-1-018x013-3.pdf | |
| # maze-0067-1-018x018-1.pdf | |
| # maze-0068-1-018x018-2.pdf | |
| # maze-0069-1-018x018-3.pdf | |
| # maze-0070-1-014x019-1.pdf | |
| # maze-0071-1-014x019-2.pdf | |
| # maze-0072-1-014x019-3.pdf | |
| # maze-0073-1-019x014-1.pdf | |
| # maze-0074-1-019x014-2.pdf | |
| # maze-0075-1-019x014-3.pdf | |
| # maze-0076-1-019x019-1.pdf | |
| # maze-0077-1-019x019-2.pdf | |
| # maze-0078-1-019x019-3.pdf | |
| # maze-0079-1-015x020-1.pdf | |
| # maze-0080-1-015x020-2.pdf | |
| # maze-0081-1-015x020-3.pdf | |
| # maze-0082-1-020x015-1.pdf | |
| # maze-0083-1-020x015-2.pdf | |
| # maze-0084-1-020x015-3.pdf | |
| # maze-0085-1-020x020-1.pdf | |
| # maze-0086-1-020x020-2.pdf | |
| # maze-0087-1-020x020-3.pdf | |
| # maze-0088-1-015x021-1.pdf | |
| # maze-0089-1-015x021-2.pdf | |
| # maze-0090-1-015x021-3.pdf | |
| # maze-0091-1-021x015-1.pdf | |
| # maze-0092-1-021x015-2.pdf | |
| # maze-0093-1-021x015-3.pdf | |
| # maze-0094-1-021x021-1.pdf | |
| # maze-0095-1-021x021-2.pdf | |
| # maze-0096-1-021x021-3.pdf | |
| # maze-0097-1-016x022-1.pdf | |
| # maze-0098-1-016x022-2.pdf | |
| # maze-0099-1-016x022-3.pdf | |
| # maze-0100-1-022x016-1.pdf | |
| # maze-0101-1-022x016-2.pdf | |
| # maze-0102-1-022x016-3.pdf | |
| # maze-0103-1-022x022-1.pdf | |
| # maze-0104-1-022x022-2.pdf | |
| # maze-0105-1-022x022-3.pdf | |
| # maze-0106-1-017x023-1.pdf | |
| # maze-0107-1-017x023-2.pdf | |
| # maze-0108-1-017x023-3.pdf | |
| # maze-0109-1-023x017-1.pdf | |
| # maze-0110-1-023x017-2.pdf | |
| # maze-0111-1-023x017-3.pdf | |
| # maze-0112-1-023x023-1.pdf | |
| # maze-0113-1-023x023-2.pdf | |
| # maze-0114-1-023x023-3.pdf | |
| # maze-0115-1-018x024-1.pdf | |
| # maze-0116-1-018x024-2.pdf | |
| # maze-0117-1-018x024-3.pdf | |
| # maze-0118-1-024x018-1.pdf | |
| # maze-0119-1-024x018-2.pdf | |
| # maze-0120-1-024x018-3.pdf | |
| # maze-0121-1-024x024-1.pdf | |
| # maze-0122-1-024x024-2.pdf | |
| # maze-0123-1-024x024-3.pdf | |
| # maze-0124-1-018x025-1.pdf | |
| # maze-0125-1-018x025-2.pdf | |
| # maze-0126-1-018x025-3.pdf | |
| # maze-0127-1-025x018-1.pdf | |
| # maze-0128-1-025x018-2.pdf | |
| # maze-0129-1-025x018-3.pdf | |
| # maze-0130-1-025x025-1.pdf | |
| # maze-0131-1-025x025-2.pdf | |
| # maze-0132-1-025x025-3.pdf | |
| # maze-0133-1-019x026-1.pdf | |
| # maze-0134-1-019x026-2.pdf | |
| # maze-0135-1-019x026-3.pdf | |
| # maze-0136-1-026x019-1.pdf | |
| # maze-0137-1-026x019-2.pdf | |
| # maze-0138-1-026x019-3.pdf | |
| # maze-0139-1-026x026-1.pdf | |
| # maze-0140-1-026x026-2.pdf | |
| # maze-0141-1-026x026-3.pdf | |
| # maze-0142-1-020x027-1.pdf | |
| # maze-0143-1-020x027-2.pdf | |
| # maze-0144-1-020x027-3.pdf | |
| # maze-0145-1-027x020-1.pdf | |
| # maze-0146-1-027x020-2.pdf | |
| # maze-0147-1-027x020-3.pdf | |
| # maze-0148-1-027x027-1.pdf | |
| # maze-0149-1-027x027-2.pdf | |
| # maze-0150-1-027x027-3.pdf | |
| # maze-0151-1-021x028-1.pdf | |
| # maze-0152-1-021x028-2.pdf | |
| # maze-0153-1-021x028-3.pdf | |
| # maze-0154-1-028x021-1.pdf | |
| # maze-0155-1-028x021-2.pdf | |
| # maze-0156-1-028x021-3.pdf | |
| # maze-0157-1-028x028-1.pdf | |
| # maze-0158-1-028x028-2.pdf | |
| # maze-0159-1-028x028-3.pdf | |
| # maze-0160-1-021x029-1.pdf | |
| # maze-0161-1-021x029-2.pdf | |
| # maze-0162-1-021x029-3.pdf | |
| # maze-0163-1-029x021-1.pdf | |
| # maze-0164-1-029x021-2.pdf | |
| # maze-0165-1-029x021-3.pdf | |
| # maze-0166-1-029x029-1.pdf | |
| # maze-0167-1-029x029-2.pdf | |
| # maze-0168-1-029x029-3.pdf | |
| # maze-0169-1-022x030-1.pdf | |
| # maze-0170-1-022x030-2.pdf | |
| # maze-0171-1-022x030-3.pdf | |
| # maze-0172-1-030x022-1.pdf | |
| # maze-0173-1-030x022-2.pdf | |
| # maze-0174-1-030x022-3.pdf | |
| # maze-0175-1-030x030-1.pdf | |
| # maze-0176-1-030x030-2.pdf | |
| # maze-0177-1-030x030-3.pdf | |
| # maze-0178-1-023x031-1.pdf | |
| # maze-0179-1-023x031-2.pdf | |
| # maze-0180-1-023x031-3.pdf | |
| # maze-0181-1-031x023-1.pdf | |
| # maze-0182-1-031x023-2.pdf | |
| # maze-0183-1-031x023-3.pdf | |
| # maze-0184-1-031x031-1.pdf | |
| # maze-0185-1-031x031-2.pdf | |
| # maze-0186-1-031x031-3.pdf | |
| # maze-0187-1-024x032-1.pdf | |
| # maze-0188-1-024x032-2.pdf | |
| # maze-0189-1-024x032-3.pdf | |
| # maze-0190-1-032x024-1.pdf | |
| # maze-0191-1-032x024-2.pdf | |
| # maze-0192-1-032x024-3.pdf | |
| # maze-0193-1-032x032-1.pdf | |
| # maze-0194-1-032x032-2.pdf | |
| # maze-0195-1-032x032-3.pdf | |
| # maze-0196-2-008.pdf | |
| # maze-0197-2-009.pdf | |
| # maze-0198-2-010.pdf | |
| # maze-0199-2-011.pdf | |
| # maze-0200-2-012.pdf | |
| # maze-0201-2-013.pdf | |
| # maze-0202-2-014.pdf | |
| # maze-0203-2-015.pdf | |
| # maze-0204-2-016.pdf | |
| # maze-0205-2-017.pdf | |
| # maze-0206-2-018.pdf | |
| # maze-0207-2-019.pdf | |
| # maze-0208-2-020.pdf | |
| # maze-0209-2-021.pdf | |
| # maze-0210-2-022.pdf | |
| # maze-0211-2-023.pdf | |
| # maze-0212-2-024.pdf | |
| # maze-0213-2-025.pdf | |
| # maze-0214-2-026.pdf | |
| # maze-0215-2-027.pdf | |
| # maze-0216-2-028.pdf | |
| # maze-0217-2-029.pdf | |
| # maze-0218-2-030.pdf | |
| # maze-0219-2-031.pdf | |
| # maze-0220-2-032.pdf | |
| # maze-0221-3-008.pdf | |
| # maze-0222-3-009.pdf | |
| # maze-0223-3-010.pdf | |
| # maze-0224-3-011.pdf | |
| # maze-0225-3-012.pdf | |
| # maze-0226-3-013.pdf | |
| # maze-0227-3-014.pdf | |
| # maze-0228-3-015.pdf | |
| # maze-0229-3-016.pdf | |
| # maze-0230-3-017.pdf | |
| # maze-0231-3-018.pdf | |
| # maze-0232-3-019.pdf | |
| # maze-0233-3-020.pdf | |
| # maze-0234-3-021.pdf | |
| # maze-0235-3-022.pdf | |
| # maze-0236-3-023.pdf | |
| # maze-0237-3-024.pdf | |
| # maze-0238-3-025.pdf | |
| # maze-0239-3-026.pdf | |
| # maze-0240-3-027.pdf | |
| # maze-0241-3-028.pdf | |
| # maze-0242-3-029.pdf | |
| # maze-0243-3-030.pdf | |
| # maze-0244-3-031.pdf | |
| # maze-0245-3-032.pdf | |
| # maze-0246-4-008-2.pdf | |
| # maze-0247-4-008-3.pdf | |
| # maze-0248-4-009-2.pdf | |
| # maze-0249-4-009-3.pdf | |
| # maze-0250-4-010-2.pdf | |
| # maze-0251-4-010-3.pdf | |
| # maze-0252-4-011-2.pdf | |
| # maze-0253-4-011-3.pdf | |
| # maze-0254-4-012-2.pdf | |
| # maze-0255-4-012-3.pdf | |
| # maze-0256-4-013-2.pdf | |
| # maze-0257-4-013-3.pdf | |
| # maze-0258-4-014-2.pdf | |
| # maze-0259-4-014-3.pdf | |
| # maze-0260-4-015-2.pdf | |
| # maze-0261-4-015-3.pdf | |
| # maze-0262-4-016-2.pdf | |
| # maze-0263-4-016-3.pdf | |
| # maze-0264-4-017-2.pdf | |
| # maze-0265-4-017-3.pdf | |
| # maze-0266-4-018-2.pdf | |
| # maze-0267-4-018-3.pdf | |
| # maze-0268-4-019-2.pdf | |
| # maze-0269-4-019-3.pdf | |
| # maze-0270-4-020-2.pdf | |
| # maze-0271-4-020-3.pdf | |
| # maze-0272-4-021-2.pdf | |
| # maze-0273-4-021-3.pdf | |
| # maze-0274-4-022-2.pdf | |
| # maze-0275-4-022-3.pdf | |
| # maze-0276-4-023-2.pdf | |
| # maze-0277-4-023-3.pdf | |
| # maze-0278-4-024-2.pdf | |
| # maze-0279-4-024-3.pdf | |
| # maze-0280-4-025-2.pdf | |
| # maze-0281-4-025-3.pdf | |
| # maze-0282-4-026-2.pdf | |
| # maze-0283-4-026-3.pdf | |
| # maze-0284-4-027-2.pdf | |
| # maze-0285-4-027-3.pdf | |
| # maze-0286-4-028-2.pdf | |
| # maze-0287-4-028-3.pdf | |
| # maze-0288-4-029-2.pdf | |
| # maze-0289-4-029-3.pdf | |
| # maze-0290-4-030-2.pdf | |
| # maze-0291-4-030-3.pdf | |
| # maze-0292-4-031-2.pdf | |
| # maze-0293-4-031-3.pdf | |
| # maze-0294-4-032-2.pdf | |
| # maze-0295-4-032-3.pdf |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment