Невозможно очистить тег с помощью BeautifulSoup, потому что вход с помощью запросов не работает - PullRequest
0 голосов
/ 04 августа 2020

Чтобы узнать цену, вам нужно авторизоваться. Раньше это работало, но теперь они изменили несколько вещей на своем сайте. Приведенный ниже код по-прежнему работает для URL, аукциона, заголовка и результатов, но для цены он возвращает только nan. Если значение в списке результатов является либо «лот-ставка-продолжается», либо «лот-продано», транспортное средство должно иметь значение цены.

import pandas as pd
import requests
from bs4 import BeautifulSoup
import re
import numpy as np
from multiprocessing import Pool 
from multiprocessing import cpu_count
from IPython.core.interactiveshell import InteractiveShell

# Display all output
InteractiveShell.ast_node_interactivity = "all"
pd.options.display.max_rows = 100
pd.options.display.max_colwidth = 100
pd.options.display.max_columns = None

# Scrape all vehicles per auction
data_list = [{"searchScope": "SC0520", #value options unique per auction (SC0520 = Indy 2020)
    "searchMake": "Plymouth",
    "searchModel": "Cuda",
    "searchYearStart": "1970",
    "searchYearEnd": "1971",
    "submit": ""},{"searchScope": "SC0520",
    "searchMake": "Dodge",
    "searchModel": "Challenger",
    "searchYearStart": "1970",
    "searchYearEnd": "1971",
    "submit": ""}]

headers = {
    "Referer": "https://www.mecum.com",
}

login = {"email": "arjenvgeffen@gmail.com",
        "password": "appeltaart13"}

# Get all the newest challenger and cuda lots with the function below
urls = []
title = []
auction = []
results = []
price = []

def newest_vehicles(url):
    with requests.Session() as req:
        r = req.post("https://www.mecum.com/includes/login-action.cfm", data=login)
        for data in data_list:
            for item in range(1, 2): #scrapes one page 
                r = req.post(url.format(item), data=data, headers=headers)
                soup = BeautifulSoup(r.content, 'html.parser')
                target = soup.select("div.lot")
                for tar in target:
                    urls.append(tar.a.get('href'))
                    title.append(tar.select_one("a.lot-title").text)
                    price.append(tar.span.text if tar.span.text else np.NaN)
                    auction.append(tar.select_one("div.lot-number").text.strip())
                    results2 = tar.select("div[class*=lot-image-container]")
                    for result2 in results2:
                        results.append(' '.join(result2['class']))

newest_vehicles("https://www.mecum.com/search/page/{}/")

# There should be 27 unique URLSs
len(urls) #27
len(set(urls)) #27

urls[:2]
title[:2]
results[:2]
auction[:2]
price[:2]

Бонусный вопрос (вы ничего не выиграете, кроме вашего гордость и, вполне возможно, принятый ответ :) Если у меня уже есть список с URL-адресами, как я могу использовать их в качестве входных данных для функции для очистки цены за URL-адрес. В приведенном ниже примере оценивается оценка для каждого URL (список final_urls). Мне нужна аналогичная функция, которая очищает цену за URL, но для этого потребуется дополнительный код для входа в систему. Вы можете очистить цену так: price = soup.find ("span", class_ = ("lot-price")). Text

final_urls = ['https://www.mecum.com/lots/SC0520-414334/1970-plymouth-cuda/',
 'https://www.mecum.com/lots/SC0520-414676/1970-plymouth-aar-cuda/',
 'https://www.mecum.com/lots/SC0520-414677/1971-plymouth-cuda-convertible/',
 'https://www.mecum.com/lots/SC0520-414678/1971-plymouth-cuda-convertible/',
 'https://www.mecum.com/lots/SC0520-414733/1971-plymouth-cuda/']

estimate = []
def scrape_estimate(url):
    with requests.Session() as req:
            estimate = []
            r = req.get(url)
            soup = BeautifulSoup(r.content, 'html.parser')    
            est = soup.find(class_=["lot-estimate"])
            if est:
                estimate = est.contents[0]
                estimate = re.sub("[\$\,\n\t\' ']", "", estimate)
            else:
                estimate = np.NaN

            return(estimate)

# Example to check just one URL 
scrape_estimate('https://www.mecum.com/lots/FL0120-397356/1971-plymouth-hemi-cuda-sox-and-martin-pro-stock/')

# Scrapes all the URLs in the final_urls list
p = Pool(cpu_count())
results_estimate = p.map(scrape_estimate, final_urls)#sample_urls
p.close()
p.join()

results_estimate

Я очень надеюсь, что кто-то поможет мне исправить это, спасибо !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...