Использование 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, чтобы помочь вам.