【问题标题】:Python Selenium hard webscrapingPython Selenium 硬网络抓取
【发布时间】:2021-08-11 14:12:59
【问题描述】:

网址是:https://www.jao.eu/auctions#/

你会看到“OUT AREA”下拉菜单(我看到很多 ReactSelect...)

我需要获取该列表中包含的项目的完整列表 [AT、BDL-GB、BDL-NL、BE...]。

你能帮帮我吗?

wait = WebDriverWait(driver, 20)
driver.get('https://www.jao.eu/auctions#/')

first = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.css-1739xgv-control')))

first.click()

                                                                          
second = wait.until(......

【问题讨论】:

    标签: python selenium web-scraping


    【解决方案1】:

    尝试以下操作,使用请求模块从该站点获取所需的项目列表:

    import requests
    
    link = 'https://www.jao.eu/api/v1/auction/calls/getcorridors'
    
    with requests.Session() as s:
        s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
        res = s.post(link,json={})
        items = [item['value'] for item in res.json()]
        print(items)
    

    输出类似于(截断):

    'IT-CH', 'HU-SK', 'ES-PT', 'FR-IT', 'SK-CZ', 'NL-DK', 'IT-FR', 'HU-HR'
    

    【讨论】:

    • @paul-m 谢谢,这太棒了。但我还需要在选择 OUT AREA、IN AREA、TYPE、AUCTION ID 等后刮掉jao.eu/auctions# 中存在的表格......你能帮帮我吗?
    • 这超出了您最初提出的问题的范围。请尝试创建另一个帖子来描述您的新要求。谢谢。
    • 谢谢,请查看我在这方面的下一篇文章。我需要你的帮助
    【解决方案2】:

    记录网络流量表明该页面向 REST API 发出了多个请求,其中一个端点是 getcorridors,其响应是 JSON 并包含下拉列表中的所有值。您需要做的就是模仿那个 HTTP POST 请求。不需要硒:

    def get_corridors():
        import requests
        from operator import itemgetter
    
        url = "https://www.jao.eu/api/v1/auction/calls/getcorridors"
    
        headers = {
            "Accept": "application/json",
            "Accept-Encoding": "gzip, deflate",
            "Content-Type": "application/json",
            "User-Agent": "Mozilla/5.0"
        }
    
        response = requests.post(url, headers=headers, json={})
        response.raise_for_status()
    
        return list(map(itemgetter("value"), response.json()))
        
    
    def main():
    
        for corridor in get_corridors():
            print(corridor)
        
        return 0
    
    
    if __name__ == "__main__":
        import sys
        sys.exit(main())
    

    输出:

    IT-CH
    HU-SK
    ES-PT
    FR-IT
    SK-CZ
    NL-DK
    IT-FR
    HU-HR
    FR-ES
    IT-GR
    CZ-AT
    DK-NL
    SI-AT
    CH-DE
    ...
    

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多