首页 > 解决方案 > 用 python 抓取一个杂乱无章的 javascript-heavy 网站

问题描述

我试图从这个页面上抓取家庭链接:

https://www.sreality.cz/en/search/to-rent/apartments?page=2

例如,对于第一间公寓,我想获得以下链接:

https://www.sreality.cz/en/detail/lease/flat/1+kt/plzen-jizni-predmesti-technicka/25873756#img=0&fullscreen=false

然而,该网站在 javascript 上相当繁重。通过使用 requests.get() 我只获得了一个无信息的 html 代码块:


from requests import get

i = 2
url = f"https://www.sreality.cz/en/search/to-rent/apartments?page={i}"
response = get(url)

print(response.text)

-----------------------------

<!doctype html>
<html lang="{{ html.lang }}" ng-app="sreality" ng-controller="MainCtrl">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1.0,minimal-ui">

    <!--- Nastaveni meta pres JS a ne pres Angular, aby byla nastavena default hodnota pro agenty co nezvladaji PhantomJS --->
    <title ng:bind-template="{{metaSeo.title}}">Sreality.cz ⢠reality a nemovitosti z celé ÄR</title>
    <meta name="description" content="NejvÄtší nabídka nemovitostí v ÄR. Nabízíme byty, domy, novostavby, nebytové prostory, pozemky a další reality k prodeji i pronájmu. Sreality.cz">
    <meta property="og:title"       content="Sreality.cz ⢠reality a nemovitosti z celé ÄR">
    <meta property="og:type"        content="website">
    <meta property="og:image"       content="https://www.sreality.cz/img/sreality-logo-og.png">

-----------------------------

ETC ...

因此,问题是,如何对此类网站进行一些简单的抓取活动?

在此先感谢您的帮助。

标签: javascriptpythonhtmlweb-scrapingbeautifulsoup

解决方案


我认为该网站没有公共 API,但从网络选项卡查看 API 调用,我可以获取您需要的详细信息并将其作为链接查看下面的代码。

如果您有任何问题,请告诉我:)

import time
import requests
page=2
numberofresults=20
epochmiliseconds=round(time.time() * 1000)
paramsdict={
    "category_main_cb":1,
    "category_type_cb":2,
    "page":page,
    "per_page":numberofresults,
    "tms":epochmiliseconds

}
data=requests.get("https://www.sreality.cz/api/en/v2/estates",params=paramsdict).json()
for lead in data["_embedded"]["estates"]:
    locality=lead["seo"]["locality"]
    name=lead["name"]
    hash_id=lead["hash_id"]
    typedata=[s for s in name.split(" ") if "+" in s][0].replace("\u00a0"," ").split(" ")[0]
    print(f'https://www.sreality.cz/en/detail/lease/flat/{typedata}/{locality}/{hash_id}'))

输出: 输出


推荐阅读