Je suis mogken dans le bureau de planification d'entreprise d'une entreprise informatique. Récemment, j'ai pensé à changer d'emploi et j'étudie la programmation pour attirer ces gens. Le simple fait de dire que vous étudiez oralement ne fait pas un grand attrait, j'ai donc créé une simple application Web avec Python et Django, l'ai construite sur AWS et publié la source sur Github.
Cette fois, je voudrais expliquer le programme (Python) que j'ai écrit moi-même, qui sert également de sortie pour corriger les connaissances en moi. Cela fait trois mois que j'étudie Python, et c'est la première fois que je crée quelque chose comme ça à partir de zéro. Si vous avez des conseils sur la façon d'améliorer le code, je vous serais reconnaissant de bien vouloir commenter.
Création d'une application Web qui ressemble à deux sites de bouche-à-oreille d'entreprise + grattage et affichage des informations sur les sociétés cotées, dans l'espoir qu'elle aidera à comparer les entreprises lors du changement d'emploi. Je n'ai pas beaucoup utilisé à la fin ... orz
L'interface utilisateur est créée rapidement à l'aide de Bootstrap sans trop de tracas Framework utilise Django Serveur basé sur Amazon Linux sur AWS
UI | Langue | Cadre | serveur |
---|---|---|---|
Bootstrap4 | Python | Django | AWS(Amazon Linux + Nginx) |
・ Entrez le nom de l'entreprise que vous souhaitez rechercher dans la fenêtre de recherche ・ Obtenez des informations (HTML) contenant des sociétés de recherche en grattant des sites cibles -Extraire uniquement les informations nécessaires des informations acquises (HTML) (parse) -Information requise Points de bouche à oreille d'entreprise Informations telles que le nombre d'employés (pour les sociétés cotées) ・ Afficher comme résultats de recherche
Utilisez Belle soupe pour obtenir des informations (grattage) du site cible
searchCompany.py
#Ajouter le site analysé ici
targetSite =['vorkers', 'hyoban', 'jyoujyou']
class GetHtml:
"""
GetHtml as text
"""
#Enregistrement de l'URL du site de recherche
def __init__(self, company):
self.headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0",}
self.urls = {
targetSite[0]:'https://www.vorkers.com/company_list?field=&pref=&src_str={}&sort=1&ct=top'.format(company),
targetSite[1]:'https://en-hyouban.com/search/?SearchWords={}'.format(company),
targetSite[2]:'https://Recherche de sociétés cotées.com/searches/result?utf8=✓&search_query={}'.format(company)
}
#Obtenez le texte Html complet de la page cible
def getText(self):
textList = {}
for url in self.urls:
res = requests.get(self.urls[url], headers=self.headers)
text = bs4.BeautifulSoup(res.text, "html.parser")
textList.setdefault(url, text)
return textList
init self.headers Configurer pour déguiser que vous essayez d'obtenir des informations à partir d'un navigateur Web Si le serveur du site cible reconnaît qu'il essaie de gratter, il peut être bloqué, il est donc nécessaire de déguiser qu'il s'agit d'un accès depuis un navigateur Web.
self.urls Définissez l'URL de la page de recherche du site à supprimer Obtenez des informations sur la société de chaque site en transmettant le nom de la société saisi par l'utilisateur en tant qu'argument à l'emplacement spécifié sous la chaîne de requête (? =) De chaque site.
** (chaîne de requête) ** Une chaîne spécifique à la fin de l'url pour décrire les informations que vous souhaitez envoyer au serveur. Cela commence souvent par? =. Lors de la recherche d'un mot-clé spécifique sur le site, le mot-clé que l'utilisateur souhaite rechercher est décrit sous la chaîne de requête et envoyé au serveur. Le serveur identifie le mot que vous souhaitez rechercher dans cette chaîne particulière, renvoie les informations nécessaires et le navigateur affiche ces informations.
En d'autres termes, si vous entrez le mot-clé que vous souhaitez rechercher sous la chaîne de requête, vous pouvez effectuer une recherche sans saisir de caractères dans la fenêtre de recherche.
getText
Une fonction qui renvoie un dictionnaire avec le targetSite comme clé et la valeur d'information HTML acquise. Les informations acquises (HTML) sont stockées dans un dictionnaire, et seules les informations que vous souhaitez transmettre au traitement suivant sont extraites.
Site cible: openWork (anciennement: Vorkers) / La réputation de Kaisha Informations requises: points d'évaluation / nom de l'entreprise
searchCompany.py
class ParseHtml:
"""
ParseHtmlHtml to get required values
"""
#Acquisition du nom de l'entreprise et des points d'évaluation
def parseNamePoint(self, textList):
#Enregistrement des balises pour la perspective
nameTag = {
targetSite[0]:["h3", "fs-18 lh-1o3 p-r"],
targetSite[1]:["h2", "companyName"],
}
pointTag = {
targetSite[0]:["p", "totalEvaluation_item fs-15 fw-b"],
targetSite[1]:["span", "point"],
}
comNamePoint = {}
for site in targetSite[:2]:
try:
#Acquisition du nom de l'entreprise
parseCname = textList[site].find(nameTag[site][0], class_=nameTag[site][1])
cname = parseCname.getText().replace('\n','').replace(' ', '')
#Acquisition des points d'évaluation de l'entreprise
parseCpoint = textList[site].find(pointTag[site][0], class_=pointTag[site][1])
cpoint = parseCpoint.getText().replace('\n','').replace(' ', '')
#Traitement lorsqu'il n'y a pas de résultat de recherche
except AttributeError:
comNamePoint.setdefault(site, ['Aucun résultat','Aucun résultat'])
#Traitement lorsqu'il y a un résultat de recherche
else:
comNamePoint.setdefault(site, [cname, cpoint])
return comNamePoint
parseNamePoint(self, textList) nameTag Balise HTML décrite pour l'acquisition du nom de l'entreprise
pointTag Incluez des balises HTML pour obtenir des notes de bouche à oreille
** (balise HTML) ** Le navigateur affiche la page Web en fonction des informations HTML envoyées par le serveur. Donc les informations nécessaires
** pour peine ** Étant donné que le processus consiste à transférer le nom de la société saisi à l'URL incluse dans la chaîne de requête, la page peut ne pas exister en fonction du nom de la société. Le traitement des exceptions pour cela est effectué ici.
-Vue d'ensemble de la gestion des exceptions ・ S'il y a un résultat de recherche, un dictionnaire avec des points d'évaluation et le nom de l'entreprise comme valeur est renvoyé en utilisant targetSite comme clé. -Erreur quand il n'y a aucun résultat de recherche AttributeError est détecté et un dictionnaire avec une valeur de "aucun résultat" est renvoyé.
Site cible: recherche d'entreprises répertoriées Informations requises: Nom de l'entreprise / Secteur d'activité / Nombre d'employés / Âge moyen / Années de service moyennes / Salaire moyen
searchCom.py
#Si vous êtes une société cotée, obtenez les détails de la société
def parseInfo(self, textList):
#Enregistrement des balises pour la perspective
cnumberTag = {
targetSite[2]:['dl', 'well'],
}
cinfoTag = {
targetSite[2]:['dd', 'companies_data']
}
comInfo = {}
#Obtenir l'URL des détails de l'entreprise à partir du nom de l'entreprise
try:
parseCnumber = textList[targetSite[2]].find(cnumberTag[targetSite[2]][0], class_=cnumberTag[targetSite[2]][1])
cnumber = parseCnumber.getText()
cname = mojimoji.han_to_zen(cnumber[5:].replace('\n', '').replace(' ', ''))
detail = 'https://xn--vckya7nx51ik9ay55a3l3a.com/companies/{}'.format(cnumber[:5])
#Traitement lorsqu'il n'y a pas de résultat de recherche
except AttributeError:
comInfo.setdefault(targetSite[2], ['Pas de données','','','','','',''])
#Traitement lorsqu'il y a un résultat de recherche
else:
#Obtenez Html sur la page des détails de l'entreprise
res = requests.get(detail)
text = bs4.BeautifulSoup(res.text, "html.parser")
#Perspective de la page de détail de l'entreprise
parseCinfo = text.find_all(cinfoTag[targetSite[2]][0], class_=cinfoTag[targetSite[2]][1])
cinfo = parseCinfo
#Acquisition de contenu analysé
cinfoList = []
for info in cinfo:
infoText = info.getText().replace('\n', '').replace('\t', '')
cinfoList.append(infoText)
#Ajouter le nom de l'entreprise
cinfoList.append(cname)
if len(cinfoList) <= 18:
cinfoList.append('')
#Moulage des informations nécessaires
useList = itemgetter(0,10,14,15,16,17,18)(cinfoList)
comInfo.setdefault(targetSite[2], useList)
return comInfo
def parseInfo(self, textList) cnumberTag Dans la recherche de société répertoriée, le simple fait de saisir le nom de la société sous la chaîne de requête ne génère pas d'URL permettant d'obtenir les détails de la société.Par conséquent, spécifiez une balise HTML pour obtenir l'URL de la page où des informations détaillées peuvent être obtenues dans cnumberTag.
cinfoTag Spécifiez une balise pour obtenir les informations requises à partir de la page de détails de l'entreprise
** essayez, sauf *** Puisqu'il n'y a peut-être pas de résultats de recherche ici également, le traitement des exceptions est effectué dans ce cas.
** pour déclaration ** En utilisant targetSite comme clé comme valeur de retour, traitez les données afin que la liste des informations nécessaires puisse être renvoyée par le dictionnaire de valeurs.
searchCompany.py
def main(company):
aboutCompany = {}
#Obtenir l'URL et le HTML
getHtml = GetHtml(company)
text = getHtml.getText()
urls = getHtml.urls
#perspective html
parseHtml = ParseHtml()
comNamePoint = parseHtml.parseNamePoint(text)
comInfo = parseHtml.parseInfo(text)
#Mise en forme des données de sortie
#Nom de l'entreprise et points d'évaluation
for site in targetSite[:2]:
comNamePoint[site].append(urls[site])
aboutCompany.update(comNamePoint)
#Détails de l'entreprise
for info in comInfo:
aboutCompany.setdefault(info, comInfo[info])
#Rechercher un mot
words = mojimoji.han_to_zen(company)
aboutCompany['searchWord'] = words
return aboutCompany
if __name__ =="__main__":
print(main('Softbank'))
main(company) aboutCompany Il récupère et analyse le code HTML avec le nom de la société saisi comme argument, le stocke dans un dictionnaire nommé aboutCompany et le renvoie sous forme de variable. Après cela, Django est en train de le spécifier correctement et de l'afficher en HTML.
mojimoji Utilise une bibliothèque externe appelée mojimoji qui convertit les caractères demi-largeur en caractères pleine largeur La demi-largeur et la pleine largeur ne sont pas unifiées en fonction du site qui extrait les informations, elles sont donc converties dans un lot.
C'est tout pour ce commentaire. Le programme a été achevé il y a plus d'un mois, il était donc difficile d'oublier les détails. Je ne peux rien dire car j'ai remarqué dans mon code qu'il est difficile de relire du code sale ...
Ensuite, j'écrirai l'édition Django et AWS.
Recommended Posts