【问题标题】:Trouble when webscraping Leboncoin网络抓取 Leboncoin 时出现问题
【发布时间】:2021-10-10 12:16:29
【问题描述】:

我正在尝试从 leboncoin 中抓取一些关于汽车的信息。

我使用 jupyter notebook 来克服 Datadome。这是我的第一个单元格:

import pandas as pd
import numpy as np
import time
import random
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait     
from selenium.webdriver.common.by import By     
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys


PATH = "chromedriver.exe"

options = webdriver.ChromeOptions() 

options.add_argument("--disable-gpu")
options.add_argument('enable-logging')
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(options=options, executable_path=PATH)

driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})

url = 'https://www.leboncoin.fr/voitures/offres'

driver.get(url)

在这里我手动切换以绕过机器人测试并运行它:

cookie = driver.find_element_by_xpath('//*[@id="didomi-notice-agree-button"]')
try:
    cookie.click()
except:
    pass

time.sleep(2)


car = driver.find_element_by_xpath('//input[@autocomplete="search-keyword-suggestions"]')
car.click()
car.send_keys('Peugeot')
car.send_keys(Keys.ENTER)
time.sleep(3)

然后,我运行这个:

next = driver.find_element_by_xpath('//a[@title="Page suivante"]')

for x in range(2):
    time.sleep(3)
    
    links = driver.find_elements_by_class_name("styles_adCard__2YFTi")
    for l in links:
        data = l.text
        print(data)
        print()
        
    next = driver.find_element_by_xpath('//a[@title="Page suivante"]')
    next.click()
    time.sleep(3)

不幸的是,我找不到如何创建合适的数据帧,这是因为我想要的所有对象的 html 结构都是相同的,所以我无法将它们清楚地分开。

我得到了类似的东西:

5
Peugeot 2008 1,6l Blue-HDI 92cv à 7800e (Ann2015/Toit panoramique)
PRO
7 500 €
Année
2015
Kilométrage
100000 km
Carburant
Diesel
Boîte de vitesse
Manuelle
Baie-Mahault 97122

5
PEUGEOT 206 1.4 i 75 CV XR PRESENCE
PRO
3 990 €
Année
2002
Kilométrage
104152 km
Carburant
Essence
Boîte de vitesse
Manuelle
Châtellerault 86100

我想要某种数据框,类似这样的:

通常我可以解决这个问题,但通常情况下,每个元素的 html 结构都不同,这里都是一样的,所以我有点迷茫。

【问题讨论】:

    标签: python python-3.x dataframe selenium web-scraping


    【解决方案1】:

    查看“https://www.leboncoin.fr/voitures/offres”的页面源,我看到数据包含在同名的HTML类中。我知道这是您所指的问题。

    例如,“年”和“公里”都包含在同名的类中:

    > <span class="_137P- P4PEa _3j0OU">2020</span>
    
    > <span class="_137P- P4PEa _3j0OU">40000 km</span>
    

    你所在的元素毕竟在网页上具有特定且恒定的顺序。

    根据我的经验,在棘手的情况下,我使用 Beautiful soup 分别从网页中提取每个元素,使用 .child / .sibling / .parent 方法。

    我相信您仍然应该能够使用 Selenium 来获取它们,并使用 xpath 说明您所追求的兄弟姐妹列表中的哪个元素。因此:

    //*[@id="container"]/main/div/div[1]/div[6]/div/div[5]/div[1]/div[1]/div[1]/div[2]/a/div/div[2]/div[1]/div[4]/div/p[1]/span
    

    上述 xpath 字符串中的最后一个 p[n] 是您所追求的元素:

    p[1] = 'Year' 
    p[2] = 'Kilometrage'
    p[3] = etc.
    

    【讨论】:

    • 我试过driver.find_elements_by_xpath('[@id="container"]/main/div/div[1]/div[6]/div/div[5]/div[1]/div[1]/div[1]/div[2]/a/div/div[2]/div[1]/div[4]/div/p[1]/span'),但它不起作用:/
    • 将 //* 添加到字符串的开头。
    • 我试过这个links = driver.find_elements_by_xpath('//*[@id="container"]/main/div/div[1]/div[6]/div/div[5]/div[1]/div[1]/div[1]/div[2]/a/div/div[2]/div[1]/div[4]/div/p[1]/span') for l in links: data = l.text print(data),但它没有打印任何东西。
    • 我认为你应该找到一个元素(不是元素),因此 driver.find_element_by_xpath('xpath').text = 'Year'
    • links = driver.find_element_by_xpath('//*[@id="container"]/main/div/div[1]/div[6]/div/div[5]/div[1]/div[1]/div[1]/div[2]/a/div/div[2]/div[1]/div[4]/div/p[1]/span').text print(links) 但又不打印任何东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2016-10-12
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多