Créez une application de scraping avec Python + Django + AWS et modifiez les tâches

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.

Ce produit fini

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 img80.jpg

Aperçu

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)

Détails du programme

Flux de programme

・ 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

__ Obtenir des informations (HTML) répertoriant les sociétés de recherche à partir du site cible __

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.

__ Extraction des informations nécessaires (à partir du site de bouche à oreille) __

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é.

__ Extraction des informations nécessaires (à partir de la recherche de sociétés cotées) __

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.

__ Affiché ensemble comme résultats de recherche __

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.

À la fin

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

Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
Créez une application de bureau avec Python avec Electron
Lancement d'une application Web sur AWS avec django et modification des tâches
[Pratique] Créez une application Watson avec Python! # 1 [Discrimination linguistique]
Essayez de créer un jeu simple avec Python 3 et iPhone
Faisons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 1] ~ Django setup ~
Faites une loterie avec Python
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Créons une application Mac avec Tkinter et py2app
Créez des tweets ordinaires comme une flotte avec AWS Lambda et Python
[Pratique] Créez une application Watson avec Python! # 3 [Classification du langage naturel]
Scraping avec Node, Ruby et Python
Faisons une interface graphique avec python.
Grattage avec Python, Selenium et Chromedriver
Grattage avec Python et belle soupe
Créer un système de recommandation avec python
Créer un filtre avec un modèle django
Faisons un graphe avec python! !!
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Faisons une discussion WEB en utilisant WebSocket avec AWS sans serveur (Python)!
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Démonisez une application Web Python avec Supervisor
Faisons la voix lentement avec Python
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Qt pour l'application de bureau de l'application Python
Créez un framework Web avec Python! (1)
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Touchez AWS avec Serverless Framework et Python
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Grattage avec Python
Grattage avec Python
Grattage de la nourriture avec python et sortie en CSV
Créer un bot Twitter Trend avec heroku + Python
Construire un environnement python avec virtualenv et direnv
Comment développer une application de panier avec Django
Je veux faire un jeu avec Python
[Python] Créer un environnement de développement Django avec Docker
Essayez de créer un code de "décryptage" en Python
Lancer un serveur Web avec Python et Flask
Remplaçons UWSC par Python (5) Faisons un robot
Essayez de créer un groupe de dièdre avec Python
Liste de tâches simple créée avec Python + Django
Créez rapidement un environnement Python Django avec IntelliJ
[# 1] Créez Minecraft avec Python. ~ Recherche préliminaire et conception ~
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
Créons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 2] ~ Configuration de Vue ~
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Django 1.11 a démarré avec Python3.6