User:Lidia.Pereira/PTSP/SSC
This test is an adaptation of the gender Turing test to distinguish between a man and a woman, which itself derives from the original Turing test to distinguish between a human and machine. However, as Andrew Hodges put it, Turing's experiments are problematic due to their lack of understanding of the impact of sex, society and politics on what people might think, that is, they lack the realization that gender is nothing but a social construction. That said, this adaptation features sets of skills scraped from Linkedin and your role is to drag them to the column where you think they belong. How do you perceive these skills?
1st Step: Scrape it like it's hot
<syntaxhighlight lang="python"> import html5lib from urlparse import urljoin, urldefrag import urllib2, urllib from urllib2 import urlopen from xml.etree import ElementTree as ET import time, json, argparse
parser = argparse.ArgumentParser()
parser.add_argument("-url", help="start crawling!")
args = parser.parse_args()
preffix1 = args.url preffix2 = "http://www.linkedin.com/pub/dir/" preffix3 = "http://www.linkedin.com/pub/" start_urls = [preffix1] middle_ground = [] personal_pages = [] history = [] dbase = open("linkedin_database.txt", "a") datab = open("tryout_databse.txt", "a") dictionary = {} same_name = same_sex = listing = found = False
while start_urls:
url = start_urls[0] print url start_urls = start_urls[1:] try: f = urlopen(url) parsed = html5lib.parse(f, namespaceHTMLElements=False) ol = parsed.findall(".//ol") + parsed.findall(".//ul") for o in ol: if o.attrib.get("class") == "primary" or o.attrib.get("class") == "directory": main_index = o if main_index == None: continue alink = main_index.findall(".//li/a") for b in alink: if b.get("href") == None: continue joinity = urljoin(f.geturl(), b.attrib.get("href")) joinity = urldefrag(joinity)[0] if joinity not in history and joinity not in start_urls and joinity.startswith(preffix1): start_urls.append(joinity) history.append(joinity) elif joinity not in history and joinity not in middle_ground and joinity.startswith(preffix2): middle_ground.append(joinity) history.append(joinity) elif joinity not in history and joinity not in personal_pages and joinity.startswith(preffix3) and preffix2 not in joinity: personal_pages.append(joinity) history.append(joinity) except urllib2.URLError: print "Nee!"
if middle_ground:
for mg in middle_ground: url = middle_ground[0] middle_ground[1:] try: m = urlopen(url) parsol = html5lib.parse(m, namespaceHTMLElements=False) li = parsol.findall(".//li") for i in li: if i.attrib.get("class") == "vcard": blink = i.findall(".//a") for bl in blink: href = bl.attrib.get("href") joini = urljoin(mg,href) if joini not in history and joini not in personal_pages and joini.startswith(preffix3): personal_pages.append(joini) except urllib2.URLError: print "Nee Nee Nee!"
if personal_pages:
for p in personal_pages: url = personal_pages[0] print url personal_pages = personal_pages[1:] try: n = urlopen(url) parsing = html5lib.parse(n, namespaceHTMLElements=False) lo = parsing.findall(".//ol") name = parsing.findall(".//span") for l in lo: if l.attrib.get("id") == "skills-list": found = True datab.write("SKILLS: ") list_item = l.findall(".//li/span") for l_i in list_item: listing += l_i.text.strip() + ", " if l_i != list_item[len(list_item)-1]: datab.write(l_i.text.encode("utf-8").strip() + ", ") elif l_i == list_item[len(list_item)-1]: datab.write(l_i.text.encode("utf-8").strip()) datab.write("\n") if found: for na in name: if na.attrib.get("class") == "given-name": given_name = na.text.encode("utf-8").lower().split() given_name = given_name[0] dictionary["name"] = given_name datab.write("NAME:"+ given_name + '\n') global same_name, same_sex if given_name != same_name: print given_name, "virou" same_name = given_name feed = urllib2.urlopen("https://gender-api.com/get?name="+ given_name +"&key=NhFeoBVUosjBsrAJAb") if feed == None: continue data = json.load(feed) sex = data['gender'] same_sex = sex datab.write("SEX:"+ sex + '\n') dictionary["sex"] = sex else: print given_name , "ta na mesma" datab.write("SEX:"+ same_sex + '\n') dictionary["sex"] = same_sex datab.write("\n") dictionary["skills"] = listing.encode("utf-8").rstrip(", ") dbase.write(urllib.urlencode(dictionary) + "\n") print dictionary found = False listing = except urllib2.URLError: print "Nee!"
</syntax>
2nd Step: Process the Database and add id's
<syntaxhighlight lang="python"> import uuid, urlparse, urllib
dbase = open("linkedin_database.txt","r") datab = open("newLinkedin_database.txt","w") lines = dbase.readlines()
for line in lines:
d = urlparse.parse_qs(line.rstrip()) if "id" not in d and "f" not in d and "m" not in d: d["id"] = [str(uuid.uuid1())] d["m"] = [str(0)] d["f"] = [str(0)] datab.write(urllib.urlencode(d)+"\n")
</syntax>
3rd Step: Create the Interface
<syntaxhighlight lang="python">
- !/usr/bin/env python
- -*- coding:utf-8 -*-
import cgi, urllib import cgitb; cgitb.enable() import urlparse, time, random import urllib2
datab = open("newLinkedin_database.txt", "r")
lines = datab.readlines() random.shuffle(lines) lista = [] count = 1
print "Content-Type: text/html"
print
print """
<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title> Gender Turing Test </title> <link rel='stylesheet' href='../jquery-ui-1.10.4.custom/css/ui-lightness/jquery-ui-1.10.4.custom.css'> <script src='../jquery-ui-1.10.4.custom/js/jquery-1.10.2.js'></script> <script src='../jquery-ui-1.10.4.custom/js/jquery-ui-1.10.4.custom.js'></script> <style> #enquadrado{position:absolute; margin-left:3%; margin-top:1.5%; width:40%} #lesdraggables{ width: 300px; position:absolute; margin-left:47%;} #lesdroppables{position:absolute; margin-left:70%; z-index:-999} #column{font-family:sans-serif; text-align:center} .draggable { width: 103px; height: 20px; padding: 0.5em; margin: 10px 10px 10px 0; float:left} #male { width: 150px; height: 550px; padding: 0.5em; margin-right: 10px; float: left } #female { width: 150px; height: 550px; padding: 0.5em; margin-right: 10px; float: left } p {font-family:georgia; font-size:11px, text-align:center} #explanation {font-family:sans-serif; font-size:13px; color: #009999; line-height:17px } #title {font-family:sans-serif; font-size: 23px; color: #FF5050} select { width: 100px; } #visualizer{font-family:sans-serif; font-size:13px; color: #099; text-transform:uppercase; text-decoration: none;} #visualizer:hover{color:#FF5050} </style> <script src= '../genderturingtestskillset.js'> </script> </head> <body>
Gender Turing Test
This test is an adaptation of the gender Turing test to distinguish between a man and a woman, which itself derives from the original Turing test to distinguish between a human and machine. However, as Andrew Hodges put it, Turing's experiments are problematic due to their lack of understanding of the impact of sex, society and politics on what people might think, that is, they lack the realization that gender is nothing but a social construction. That said, this adaptation features sets of skills scraped from Linkedin and your role is to drag them to the column where you think they belong. How do you perceive these skills? (<a href= 'genderturingresults.cgi' id='visualizer'> Visualizer </a>)
<button id='done'>Done!</button>
"""
for line in lines:
if count < 21: d = urlparse.parse_qs(line.rstrip()) skills = d["skills"][0] id = str(d['id'][0]) id = id.strip("[]")print " "
else: break count += 1print """
</html> """
</syntax>
4th Step: Make it interactive and communicate with the back-end
<syntaxhighlight lang="python"> $(function() {
$('.ui-widget-content').each(function(){ $(this).draggable() }); $("#male").droppable({ drop: function( event, ui ) { console.log("DROP",this, ui) $(this) .find('p') .addClass('ui-state-highlight'); $(ui.draggable) .removeClass('female') .addClass('male') } }); $("#female").droppable({ drop: function( event, ui ) { console.log("DROP",this) $(this) .find('p') .addClass('ui-state-highlight') $(ui.draggable) .removeClass('male') .addClass('female')
} }); $('#done').click(function (){
var data = {male:[], female:[] }; $(".draggable.male").each(function(){ console.log("male",this) var id = $(this).attr("id") data["male"].push(id) }) $(".draggable.female").each(function(){ console.log("female",this) var id = $(this).attr("id") data["female"].push(id) }) $.ajax({ type: "POST", url: "/cgi-bin/genderturingtestvotes.cgi", data: data, success: function(data){ alert("Thank you!") //console.log("python sent", data); }, error: function(obj, e) { console.log(e, "error") } // contentType: "application/x-www-form-urlencoded; charset=UTF-8",
//dataType: "json" }) } ); });
</syntax>
5th Step: The Back-end which processes the votes <syntaxhighlight lang="python">
- !/usr/bin/env python
- -*- coding:utf-8 -*-
import cgi, urllib, sys import json, urlparse
form = cgi.FieldStorage() malevalue = form.getlist("male[]") femalevalue = form.getlist("female[]")
dbase = open("newLinkedin_database.txt","r") lines = dbase.readlines() datab = open("newLinkedin_database.txt","w") newfile= open("TestnewFile.txt","a") dictionary = {}
for line in lines:
d = urlparse.parse_qs(line.rstrip()) dictionary["id"]= d["id"][0] dictionary["skills"]= d["skills"][0] for mv in malevalue: if mv in d["id"][0]: mvalue = d["m"][0].strip("[]") mvalue = int(mvalue) + 1 dictionary["m"] = [str(mvalue)] else: dictionary["m"] = d["m"][0] for fm in femalevalue: if fm in d["id"][0]: fvalue = d["f"][0].strip("[]") fvalue = int(fvalue) + 1 dictionary["f"] = [str(fvalue)] else: dictionary["f"] = d["f"][0] del line datab.write(urllib.urlencode(dictionary)+"\n")
</syntax>
6th Step: The Visualizer
<syntaxhighlight lang="python">
- !/usr/bin/env python
- -*- coding:utf-8 -*-
import cgi, urllib, sys import json, urlparse
voteDb = open("newLinkedin_database.txt","r")
lines = voteDb.readlines()
count = 1
print "Content-Type: text/html" print print """
<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <script src='/jquery-ui-1.10.4.custom/js/jquery-1.10.2.js'></script> <title> Gender Turing Test Visualizer </title> <script>
</script> <style> #mas{ width:50%; float:left; height:755px; height: 98vh; } #fem { width:49%; float:left; height: 98vh; border-right: 2px dashed #FF5050; } select { width: 100px; }
h1{ font-family:sans-serif; font-size: 23px; color: #FF5050; text-align: center; } #container {width:99%; position:absolute; margin-top:7vh; height:91vh} </style>
</head> <body>
Feminine
Masculine
"""
for line in lines:
d = urlparse.parse_qs(line.rstrip()) skills = d["skills"][0] if int(d["f"][0].strip("[]")) > 0 or int(d["m"][0].strip("[]")) > 0: feminine = int(d["f"][0].strip("[]")) masculine = int(d["m"][0].strip("[]")) total = int(masculine) + int(feminine) percent = str(91*masculine/total)print "
print "<select class ='margina'>" print "<option value='skillset'>Skill Set %s</option>" % count for s in skills.split(","): if "['" in s: s=s.strip("['") if "']" in s: s=s.strip("']") print "<option disabled value ='skill'>"+ s +"</option>"print "</select>
count += 1print """
<script> var coisinhas = document.getElementsByClassName('margina'); for(var i = 0; i < coisinhas.length; i ++) {
var valor = Math.floor((Math.random() * 44) + 1); coisinhas[i].style.marginTop = valor+'px';
} </script>""" print "</body>" print "</html>" </syntax>