【问题标题】:Selenium scraping硒刮
【发布时间】:2020-08-23 15:19:54
【问题描述】:

我正在尝试想出一种方法来抓取 Zillow 上的房屋信息,我目前正在使用 xpath 来查看租金价格、本金和抵押贷款成本、保险成本等数据。

我能够使用 xpath 找到信息,但我想让它自动运行并将其放入 for 循环中,但我意识到,当我使用 xpath 时,并非每个列表的所有数据都具有相同的 xpath 信息。对于某些人来说,它会偏离列表或 div 的 1。请参阅下面的代码了解我的意思。我怎样才能更具体?有没有办法查找“本金和利息”之类的字符串并选择下一个值,即我要查找的数值?

适用于一个列表:

driver.find_element_by_xpath("/html/body/div[1]/div[6]/div/div[1]/div[1]/div[1]/ul/li [1]/article/div[1]/div[2]/div")

不同的列表将包含以下内容:

driver.find_element_by_xpath("/html/body/div[1]/div[6]/div/div[1]/div[1]/div[2]/ul/li [1]/article/div[1]/div[2]/div")

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    您使用的 xpath 特定于第一个清单的元素。为了能够访问每个列表的元素,您需要以一种可以帮助您访问每个列表的元素的方式使用 xpath:

    import pandas as pd    
    from selenium import webdriver
    

    我搜索了曼哈顿的待售房源并获得了以下网址 url = "https://www.zillow.com/homes/Manhattan,-New-York,-NY_rb/"

    要求 selenium 在 Chrome 中打开上述链接

    driver = webdriver.Chrome()
    driver.get(url)
    

    我将鼠标悬停在其中一个房屋清单上,然后单击“检查”。这打开了 HTML 代码并突出显示了我正在检查的项目。我注意到具有“list-card-info”类的元素包含我们需要的所有房子信息。因此,我们的策略是让每个房子都访问具有类“list-card-info”的元素。因此,使用以下代码,我将所有此类 HTML 块保存在 house_cards 变量中

    house_cards = driver.find_elements_by_class_name("list-card-info")
    

    house_cards 中有 40 个元素,即每个房子一个(每页列出 40 个房子)

    我遍历这 40 个房子中的每一个,并提取我需要的信息。请注意,我现在使用的是特定于“list-card-info”元素中的元素的 xpath。我将此信息保存在熊猫数据报中。

    address = []
    price = []
    bedrooms = []
    baths = []
    sq_ft = []
    
    for house in house_cards:
        address.append(house.find_element_by_class_name("list-card-addr").text)
        price.append(house.find_element_by_class_name("list-card-price").text)
        bedrooms.append(house.find_element_by_xpath('.//div[@class="list-card-heading"]/ul[@class="list-card-details"]/li[1]').text)
        baths.append(house.find_element_by_xpath('.//div[@class="list-card-heading"]/ul[@class="list-card-details"]/li[2]').text)
        sq_ft.append(house.find_element_by_xpath('.//div[@class="list-card-heading"]/ul[@class="list-card-details"]/li[3]').text)
    driver.quit()
    
    
    
    # print(address, price,bedrooms,baths, sq_ft)
    Manahattan_listings = pd.DataFrame({"address":address,
                                        "bedrooms": bedrooms,
                                        "baths":baths,
                                        "sq_ft":sq_ft,
                                        "price":price},)
    

    pandas dataframe output

    现在,要从更多页面(即第 2 页、第 3 页等)中提取信息,您可以遍历网站页面,即不断修改您的 URL 并继续提取信息

    快乐抓取!

    【讨论】:

    • 这非常有帮助。太感谢了。你为此使用jupyter笔记本吗?我以前从未使用过 pandas,你如何获取每个单独的数字?是否与访问数组的每个索引(即价格 [1])相同。如果您不介意我询问,您可以使用哪些资源来了解更多关于 pandas/selelnium 和网络抓取的信息?
    • 是的,我使用 Jupyter Notebooks。导航 pandas 类似于导航数组;您使用 [ ] 括号。您也可以使用 .iloc 和 .loc 方法。我建议您观看有关此的视频,因为这非常简单。我从谷歌搜索中学到了一切,也许观看/做一个关于 python 基础的在线视频/课程来开始。我也是初学者(但有 6 个月的学习时间)。我被困在网络报废上三天,但我一直在谷歌上搜索,事实上我也上过关于数据营的课程。所以,是的,只要继续挖掘,你就会明白的。干杯!
    • 非常感谢!我也感谢您提供的所有提示并祝您好运!
    【解决方案2】:

    使用 xpath 选择多个元素不是一个好主意。您可以查看“css 选择器”。使用它你可以获得相似的元素。

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多