【问题标题】:Scraping a messy javascript-heavy website with python用 python 抓取一个杂乱无章的 javascript-heavy 网站
【发布时间】:2021-06-24 15:35:03
【问题描述】:

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

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 ...

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

提前感谢您的帮助。

【问题讨论】:

  • 询问网站是否提供 API 来访问他们的信息。

标签: javascript python html web-scraping beautifulsoup


【解决方案1】:

首先询问网站,他们是否提供任何 API 来获取所需的信息。

scraping 期间处理 javascript 仅请求将不起作用。您应该只使用 Selenium,或者结合使用scrapy-selenium 进行scrapy。这两个允许在抓取期间加载 javascript。

如果您有任何其他问题,请随时询问。

【讨论】:

    【解决方案2】:

    我认为该网站没有公共 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}'))
    

    输出:

    【讨论】:

    • 非常感谢。它有效,但我正在使用这个练习来更好地进行网络报废。因此,如果您能回答以下问题:1)您是如何发现应该使用的 1)sreality.cz/api/en/v2/estates 2)您是如何发现这些是要使用的参数?提前致谢
    • 1) 在调用网站之前打开检查元素并转到网络选项卡,一旦网站加载,您会发现此 API 调用将类似于 prnt.sc/10yes0v(您需要在哪些数据来自)或者您可以使用 fiddler 之类的工具(这是一种更好的方法)来记录流量并查看数据来自何处的特定请求。 2)关于 paramsdict,前 4 个参数基本可以理解一次,第 5 个“tms”参数只不过是当前纪元(以毫秒为单位)。
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多