在没有 [href] 的多层网站上进行 Python 网页抓取
Posted
技术标签:
【中文标题】在没有 [href] 的多层网站上进行 Python 网页抓取【英文标题】:Python web-scraping on a multi-layered website without [href] 【发布时间】:2019-04-03 22:06:00 【问题描述】:我正在寻找一种从学生住宿网站 uniplaces 中抓取数据的方法:https://www.uniplaces.com/en/accommodation/berlin。
最后,我想为每个属性抓取特定信息,例如卧室大小、室友数量、位置。为了做到这一点,我首先必须抓取所有属性链接,然后再抓取各个链接。
但是,即使在通过控制台并使用 BeautifulSoup 提取 url 之后,我也无法提取指向单独列表的 url。它们似乎没有作为 [href] 包含在内,而且我无法在 html 代码中识别任何其他格式的链接。
这是我使用的 python 代码,但它也没有返回任何内容: 从 bs4 导入 BeautifulSoup 导入 urllib.request
resp = urllib.request.urlopen("https://www.uniplaces.com/accommodation/lisbon")
soup = BeautifulSoup(resp, from_encoding=resp.info().get_param('charset'))
for link in soup.find_all('a', href=True):
print(link['href'])
所以我的问题是:如果链接不包含在 http:// 格式或引用为 [href]:有没有办法提取列表 url?
我非常感谢任何对此的支持!
一切顺利, 汉娜
【问题讨论】:
【参考方案1】:如果您查看网络选项卡,您会发现一些专门针对此 url 的 API 调用:https://www.uniplaces.com/api/search/offers?city=PT-lisbon&limit=24&locale=en_GB&ne=38.79507211908374%2C-9.046124472314432&page=1&sw=38.68769060641113%2C-9.327992453271463
指定位置 PT-lisbon 和北(ne)和西南(sw)方向。从此文件中,您可以获取每个优惠的 id 并将其附加到当前 url,您还可以获取从网页获得的所有信息(价格、描述等...)
例如:
import requests
resp = requests.get(
url = 'https://www.uniplaces.com/api/search/offers',
params =
"city":'PT-lisbon',
"limit":'24',
"locale":'en_GB',
"ne":'38.79507211908374%2C-9.046124472314432',
"page":'1',
"sw":'38.68769060641113%2C-9.327992453271463'
)
body = resp.json()
base_url = 'https://www.uniplaces.com/accommodation/lisbon'
data = [
(
t['id'], #offer id
base_url + '/' + t['id'], #this is the offer page
t['attributes']['accommodation_offer']['title'],
t['attributes']['accommodation_offer']['price']['amount'],
t['attributes']['accommodation_offer']['available_from']
)
for t in body['data']
]
print(data)
【讨论】:
以上是关于在没有 [href] 的多层网站上进行 Python 网页抓取的主要内容,如果未能解决你的问题,请参考以下文章