2015-08-02 3 views
0

Я хотел бы автоматизировать то, что я делал, перейдя на сайт и неоднократно просматривая. В частности, я отправляюсь в This Website, прокручивая его вниз, щелкая по вкладке «Предстоящие» и просматривая разные города.Использование Python для автоматизации поиска в Интернете

Я новичок в Python, и я хотел бы просто ввести список городов для ввода для поиска и получить результат, который объединяет все результаты поиска. Так, например, следующие функции было бы здорово:

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

и напечатает

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

и так далее, список всех результатов поиска по радиусе 100 миль вокруг каждого из городов вошел.

Я пытался смотреть на документацию для requests модуля с Apache2 и я побежал

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

И распечатаны все HTML веб-страницы, так что звучит как некоторые незначительные победы, хотя я не уверен, что с ним делать.

Справка была бы принята с благодарностью, спасибо.

+1

Вы можете видеть, что делает JS на странице. В основном это все предстоящие события, загруженные (скрытые) на странице. Просмотреть все элементы с классом «предстоящее_переработка»; обратите внимание, что у них есть все данные, которые вы ищете, включая широту и долготу. Когда вы нажимаете кнопку, он просто фильтрует этот список, используя библиотеку геокодирования, чтобы найти те, которые находятся в пределах заданного радиуса лата/длинного введенного вами адреса. Может быть проще очистить полный список, а затем выполнить фильтрацию и презентацию самостоятельно в python. Рассмотрите возможность использования BeautifulSoup для перемещения HTML-документов. –

ответ

0

У вас есть два вопроса, включенных в один, так что вот частичный ответ, чтобы начать вас. Первая задача касается разбора HTML, поэтому давайте использовать библиотеки python: запросы и beautifulsoup4 (pip install beautifulsoup4 в случае, если вы еще этого не сделали).

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"}) 

Суп является судоходной структурой данных содержания страницы. Мы используем метод findAll для супа для извлечения элементов 'tr' с классом 'nextcoming_performance'. Один элемент в строках выглядит следующим образом:

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> 
""" 

Теперь давайте извлечет данные из этих строк в нашу собственную структуру данных. Для каждой строки мы создадим словарь для этой производительности.

Данные- * атрибуты каждого элемента tr доступны через поиск словарного ключа.

Элементы 'td' внутри каждого элемента tr могут быть доступны с использованием атрибута .children (или .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) 

На данный момент у нас есть список словарей в спектаклях. Ключи в каждой Dict являются:

лат: плавать

LNG: плавать

почтовый индекс: ул

performance_city-состояние: ул

performance_organization: ул

и т.д.

HTML вытяжка делает северо-восток Следующим шагом будет использование службы API сопоставления, которая сравнивает расстояние от вашего желаемого местоположения до значений lat/lng в действиях.Например, вы можете использовать API геокодирования Google Maps. Существует много существующих ответов на SO, которые помогут вам.

+0

Я вижу, я не знал, что вся информация уже была на странице и что мне нужно будет извлечь ее из нее, а затем обработать эту коллекцию данных - у меня создалось впечатление, что поиск отправил запрос в базу данных или что-то еще, а затем вернула желаемую информацию. Спасибо за вашу помощь, я думаю, что я могу взять это отсюда. – Addem

+0

Один вопрос - можно ли как-то использовать функцию фильтра поиска на веб-сайте, чтобы избежать использования API сопоставления, чтобы определить, где именно находится? Я имею в виду, если веб-сайт уже делает это как-то, мне интересно, есть ли способ «контрейлерных» от него. Или это потребует знания Javascript или, в противном случае, сделать что-то более сложное, чем просто использовать API сопоставления? – Addem

+1

Фильтр поиска на странице использует javascript версию API Карт Google. Версия python довольно похожа. Вы можете определенно посмотреть на код страницы, чтобы увидеть вызовы API, которые вы сделали бы в своем коде на языке python. – FariaC

Смежные вопросы