Let’s Talk

Searching Google From Anywhere!

Today I’d like to discuss how you can get around Google’s restrictions on localised searching; specifically, viewing localised SERPs. I put together a little web application in preparation for Dave’s session at SEOktoberfest and everyone seemed to like it. I’ll share that with you in just a little bit but before that, I’ll go into some of the internal of how I’ve done it.

Here’s a little preview, click this link and you’ll be searching for Plumbers from Manchester, here’s a screenshot (using sarcastically obnoxious arrows to illistrate my point):

screenshot_110816_094159_am
screenshot_110816_093947_am

Here’s the same results in Leeds, London and New York.

So how is this done?

First we need to create a key, these are “secret keys” based on the length of the location name – this is used as a delimiter between the Google standard protocol “CAIQICI” and the encoded base64 string, within the URL.

(code in Python)

keys = {
    4:"E", 5:"F", 6:"G", 7:"H", 8:"I", 9:"J",
    10:"K", 11:"L", 12:"M", 13:"N", 14:"O", 15:"P",
    16:"Q", 17:"R", 18:"S", 19:"T", 20:"U", 21:"V",
    22:"W", 23:"X", 24:"Y", 25:"Z", 26:"a", 27:"b",
    28:"c", 29:"d", 30:"e", 31:"f", 32:"g", 33:"h",
    34:"i", 35:"j", 36:"k", 37:"l", 38:"m", 39:"n",
    40:"o", 41:"p", 42:"q", 43:"r", 44:"s",45:"t",
    46:"u", 47:"v", 48:"w", 49:"x", 50:"y", 51:"z",
    52:0, 53:1, 54:2, 55:3, 56:4, 57:5, 58:6, 59:7,
    60:8, 61:9, 62:"-", 63:"", 64:"A", 65:"B", 66:"C",
    67:"D", 68:"E", 69:"F", 70:"G", 71:"H", 72:"I",
    73:"J", 76:"M", 83:"T", 89:"L"
    }

To explain, the URL structure is broken down as follows:

Complete URL: https://www.google.co.uk/search?q=plumbers&uule=w+CAIQICIFbGVlZHM
Standard search URL: https://www.google.co.uk/search?q=plumbers
Location specific parameter: &uule=w+CAIQICIFbGVlZHM
Standard protocol: &uule=w+CAIQICI
Secret key: F
Base64 (which we’ll get to in a minute): bGVlZHM

So the base64 encoding is the place name, encoded in base64, for example Leeds, which would become bGVlZHM.

Finally, we can tie this all together, with the following:

keys = {
    4:"E", 5:"F", 6:"G", 7:"H", 8:"I", 9:"J",
    10:"K", 11:"L", 12:"M", 13:"N", 14:"O", 15:"P",
    16:"Q", 17:"R", 18:"S", 19:"T", 20:"U", 21:"V",
    22:"W", 23:"X", 24:"Y", 25:"Z", 26:"a", 27:"b",
    28:"c", 29:"d", 30:"e", 31:"f", 32:"g", 33:"h",
    34:"i", 35:"j", 36:"k", 37:"l", 38:"m", 39:"n",
    40:"o", 41:"p", 42:"q", 43:"r", 44:"s",45:"t",
    46:"u", 47:"v", 48:"w", 49:"x", 50:"y", 51:"z",
    52:0, 53:1, 54:2, 55:3, 56:4, 57:5, 58:6, 59:7,
    60:8, 61:9, 62:"-", 63:"", 64:"A", 65:"B", 66:"C",
    67:"D", 68:"E", 69:"F", 70:"G", 71:"H", 72:"I",
    73:"J", 76:"M", 83:"T", 89:"L"
    }

place = 'leeds'
engine = '.co.uk'
keyword = 'plumbers'

# encode location name into base 64
encoded_place = place.encode('base64').replace('=', '') 

# find secert key
key =  keys[len(place)] 

# create the complete localised string
localised_string = 'w+CAIQICI{}{}'.format(key, encoded_place)

# create final query URL
serp_url = '''https://www.google{}/search?ie=UTF-8&oe=UTF-8&hl=en&q={}&uule={}&pws=0
    '''.format(engine, keyword.replace(' ', '+'), localised_string)

print serp_url

And that’s it. With a little programming knowledge you’ll be able to wrap a for loop around that to run through multiple locations or multiple queries. If you want a ready made version of the above, check out the following:

Try it here