使用 Python 自动进行网络搜索
Using Python to Automate Web Searches
我想通过访问网站并反复搜索来自动化我一直在做的事情。特别是我一直在 This Website,向下滚动到底部附近,单击 "Upcoming" 选项卡,然后搜索各个城市。
我是 Python 的新手,我希望能够仅键入要输入的城市列表以进行搜索,并获得汇总所有搜索结果的输出。因此,例如,以下功能会很棒:
cities = ['NEW YORK, NY', 'LOS ANGELES, CA']
print getLocations(cities)
它会打印
Palm Canyon Theatre PALM SPRINGS, CA 01/22/2016 02/07/2016
...
依此类推,列出每个输入城市周围 100 英里范围内的所有搜索结果。
我已经尝试查看来自 Apache2 的 requests
模块的文档,并且我 运行
r = requests.get('http://www.tamswitmark.com/shows/anything-goes-beaumont-1987/')
r.content
它打印了网页的所有 HTML,所以这听起来像是一个小小的胜利,虽然我不确定如何处理它。
不胜感激,谢谢。
您将两个问题合二为一,所以这里有部分答案可以帮助您开始。第一个任务涉及 HTML 解析,所以让我们使用 python 库:requests 和 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"})
soup 是页面内容的可导航数据结构。我们使用 soup 的 findAll 方法提取 class 'upcoming_performance' 的 'tr' 元素。行中的单个元素如下所示:
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 元素的 data-* 属性可通过字典键查找获得。
可以使用 .children(或 .contents)属性访问每个 tr 元素内的 'td' 元素。
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)
至此,我们在表演中有了字典列表。每个字典中的键是:
经纬度:浮点数
lng: 浮动
邮政编码:str
performance_city-state: 海峡
performance_organization: 海峡
等等
HTML 提取完成。您的下一步是使用映射 API 服务,将您所需位置的距离与表演中的 lat/lng 值进行比较。例如,您可以选择使用 Google 地图地理编码 API。 SO 上有很多现有的已回答问题可以指导您。
我想通过访问网站并反复搜索来自动化我一直在做的事情。特别是我一直在 This Website,向下滚动到底部附近,单击 "Upcoming" 选项卡,然后搜索各个城市。
我是 Python 的新手,我希望能够仅键入要输入的城市列表以进行搜索,并获得汇总所有搜索结果的输出。因此,例如,以下功能会很棒:
cities = ['NEW YORK, NY', 'LOS ANGELES, CA']
print getLocations(cities)
它会打印
Palm Canyon Theatre PALM SPRINGS, CA 01/22/2016 02/07/2016
...
依此类推,列出每个输入城市周围 100 英里范围内的所有搜索结果。
我已经尝试查看来自 Apache2 的 requests
模块的文档,并且我 运行
r = requests.get('http://www.tamswitmark.com/shows/anything-goes-beaumont-1987/')
r.content
它打印了网页的所有 HTML,所以这听起来像是一个小小的胜利,虽然我不确定如何处理它。
不胜感激,谢谢。
您将两个问题合二为一,所以这里有部分答案可以帮助您开始。第一个任务涉及 HTML 解析,所以让我们使用 python 库:requests 和 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"})
soup 是页面内容的可导航数据结构。我们使用 soup 的 findAll 方法提取 class 'upcoming_performance' 的 'tr' 元素。行中的单个元素如下所示:
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 元素的 data-* 属性可通过字典键查找获得。
可以使用 .children(或 .contents)属性访问每个 tr 元素内的 'td' 元素。
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)
至此,我们在表演中有了字典列表。每个字典中的键是:
经纬度:浮点数
lng: 浮动
邮政编码:str
performance_city-state: 海峡
performance_organization: 海峡
等等
HTML 提取完成。您的下一步是使用映射 API 服务,将您所需位置的距离与表演中的 lat/lng 值进行比较。例如,您可以选择使用 Google 地图地理编码 API。 SO 上有很多现有的已回答问题可以指导您。