2015-08-02 6 views
0

Je voudrais automatiser ce que j'ai fait en allant sur un site Web et en effectuant des recherches répétées. En particulier, je suis allé à This Website, en faisant défiler vers le bas près du fond, en cliquant sur l'onglet "À venir", et la recherche dans diverses villes. Je suis novice chez Python et j'aimerais pouvoir taper une liste de villes à saisir pour la recherche, et obtenir une sortie qui agrège tous les résultats de recherche. Ainsi, par exemple, les fonctionnalités suivantes serait génial:Utilisation de Python pour automatiser les recherches Web

cities = ['NEW YORK, NY', 'LOS ANGELES, CA'] 
print getLocations(cities) 

et il imprimerait

Palm Canyon Theatre PALM SPRINGS, CA 01/22/2016 02/07/2016 
... 

et ainsi de suite, la liste de tous les résultats de la recherche pour un rayon de 100 mile autour de chacune des villes entré.

J'ai essayé de regarder la documentation du module requests de Apache2 et j'ai couru

r = requests.get('http://www.tamswitmark.com/shows/anything-goes-beaumont-1987/') 
r.content 

Et il imprimé tous le code HTML de la page Web, de sorte que sonne comme une petite victoire même si je suis Je ne sais pas quoi en faire.

Une aide serait grandement appréciée, merci.

+1

Vous pouvez voir ce que fait le JS sur la page. Il a essentiellement tous les événements à venir chargés (cachés) sur la page. Voir tous les éléments avec la classe "future_performance"; Notez qu'ils ont toutes les données que vous recherchez, y compris la latitude et la longitude. Lorsque vous cliquez sur le bouton, il filtre simplement cette liste à l'aide d'une bibliothèque de géocodage pour trouver celles qui se trouvent dans le rayon donné du lat/long de l'adresse que vous avez saisie. Il peut être plus facile de gratter la liste complète, puis de faire le filtrage et la présentation par vous-même en python. Pensez à utiliser BeautifulSoup pour parcourir les documents HTML. –

Répondre

0

Vous avez deux questions regroupées en une, alors voici une réponse partielle pour vous lancer. La première tâche concerne l'analyse HTML, utilisons donc les bibliothèques python: requests, et beautifulsoup4 (pip installe beautifulsoup4 au cas où vous ne l'auriez pas déjà fait).

import requests 
from bs4 import BeautifulSoup 

r = requests.get('http://www.tamswithmark.com/shows/anything-goes-beaumont-1987/') 
soup = BeautifulSoup(r.content, 'html.parser') 
rows = soup.findAll('tr', {"class": "upcoming_performance"}) 

La soupe est une structure de données navigable du contenu de la page. Nous utilisons la méthode findAll sur la soupe pour extraire les éléments 'tr' avec la classe 'future_performance'. Un seul élément dans les lignes ressemble à:

print(rows[0]) # debug statement to examine the content 
""" 
<tr class="upcoming_performance" data-lat="47.6007" data-lng="-120.655" data-zip="98826"> 
<td class="table-margin"></td> 
<td class="performance_organization">Leavenworth Summer Theater</td> 
<td class="performance_city-state">LEAVENWORTH, WA</td> 
<td class="performance_date-from">07/15/2015</td> 
<td class="performance_date_to">08/28/2015</td> 
<td class="table-margin"></td> 
</tr> 
""" 

Maintenant, extrayons les données de ces lignes dans notre propre structure de données. Pour chaque ligne, nous allons créer un dictionnaire pour cette performance.

Les attributs data- * de chaque élément tr sont disponibles via la recherche par clé de dictionnaire.

Les éléments 'td' à l'intérieur de chaque élément tr peuvent être accédés en utilisant l'attribut .children (ou .contents).

performances = [] # list of dicts, one per performance 
for tr in rows: 
    # extract the data-* using dictionary key lookup on tr 
    p = dict(
     lat=float(tr['data-lat']), 
     lng=float(tr['data-lng']), 
     zipcode=tr['data-zip'] 
    ) 
    # extract the td children into a list called tds 
    tds = [child for child in tr.children if child != "\n"] 
    # the class of each td indicates what type of content it holds 
    for td in tds: 
     key = td['class'][0] # get first element of class list 
     p[key] = td.string # get the string inside the td tag 
    # add to our list of performances 
    performances.append(p) 

À ce stade, nous avons une liste de dictionnaires dans les performances. Les clés de chaque dict sont:

lat: float

lng: flotter

code postal: str

performance_city-état: str

performance_organization: str

etc

L'extraction HTML est fait ne. L'étape suivante consiste à utiliser un service d'API de mappage qui compare la distance entre votre emplacement souhaité et les valeurs lat/lng des performances.Par exemple, vous pouvez choisir d'utiliser l'API de géocodage Google Maps. Il y a beaucoup de réponses aux questions sur SO pour vous guider.

+0

Je vois, je n'étais pas au courant que toutes les informations étaient déjà dans la page et que je devrais l'extraire de cela, puis gérer cette collection de données - j'avais l'impression qu'une recherche a envoyé une requête à une base de données ou quelque chose, puis renvoyé l'information désirée. Merci pour votre aide, je pense que je peux le prendre d'ici. – Addem

+0

Une question - est-il possible d'utiliser la fonction du filtre de recherche dans le site Web d'une manière ou d'une autre, afin d'éviter d'utiliser une API de mappage pour déterminer les emplacements où? Je veux dire, si le site web le fait déjà d'une manière ou d'une autre, je me demande s'il y a un moyen de le "greffer". Ou cela nécessiterait-il de connaître Javascript ou d'avoir à faire quelque chose de plus compliqué que de simplement utiliser une API de cartographie? – Addem

+1

Le filtre de recherche de la page utilise la version javascript de l'API Google Maps. La version python est assez similaire. Vous pouvez certainement regarder le code de la page pour voir les appels d'API que vous feriez dans votre code python. – FariaC