Использование 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 ответ

Решение

У вас есть два вопроса в одном, так что вот частичный ответ, чтобы начать вас. Первая задача касается разбора HTML, поэтому давайте использовать библиотеки Python: запросы и beautifulsoup4 (pip установите 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' с классом 'upcoming_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>
"""

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

Атрибуты data-* каждого элемента 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)

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

lat: float

lng: float

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

performance_city-state: str

Производительность_организация: ул

так далее

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

Другие вопросы по тегам