Удаление цен с панели поиска - ссылка на сайт изменена - PullRequest
0 голосов
/ 17 июня 2020

С помощью некоторых экспертов здесь я смог создать скребок, который отлично работает.

На самом деле важная строка кода: ссылка с partsfinder.com на partssource.com, и код, кажется, работает.

Просто интересно, есть ли уловка, которую я могу использовать с исходным кодом, чтобы он снова заработал.

Любой мысли приветствуются, спасибо!

import requests
import pandas as pd


df = pd.read_excel(r'C:\Users\212677036\Documents\Part Number Input.xlsx')
PN = pd.DataFrame(df, columns=['Product code'])
9
i = 0

Total_rows = PN.shape[0]
partnumlist = []
partnumlist1 = []
partnumlist2 = []
partnumlist3 = []
partnumlist4 = []
partnumlist5 = []

while i < Total_rows:

         data = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17155"}}
         r = requests.post('https://www.partssource.com/catalog/Service', json=data).json()

         partnumlist.append(r['Data']['PartOptions'][0]['YourPrice'])

         data1 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17475"}}
         r1 = requests.post('https://www.partssource.com/catalog/Service', json=data1).json()

         partnumlist1.append(r1['Data']['PartOptions'][0]['YourPrice'])

         data2 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "16880"}}
         r2 = requests.post('https://www.partssource.com/catalog/Service', json=data2).json()

         partnumlist2.append(r2['Data']['PartOptions'][0]['YourPrice'])

         data3 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "47221"}}
         r3 = requests.post('https://www.partssource.com/catalog/Service', json=data3).json()

         partnumlist3.append(r3['Data']['PartOptions'][0]['YourPrice'])

         data4 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17045"}}
         r4 = requests.post('https://www.partssource.com/catalog/Service', json=data4).json()

         partnumlist4.append(r4['Data']['PartOptions'][0]['YourPrice'])

         data5 = {"partOptionFilter": {"PartNumber": PN.iloc[i, 0], "AlternativeOemId": "17055"}}
         r5 = requests.post('https://www.partssource.com/catalog/Service', json=data5).json()

         partnumlist5.append(r5['Data']['PartOptions'][0]['YourPrice'])

         i=i+1

list_of_dataframes = [pd.DataFrame(partnumlist),pd.DataFrame(partnumlist1),
               pd.DataFrame(partnumlist2), pd.DataFrame(partnumlist3),
               pd.DataFrame(partnumlist4), pd.DataFrame(partnumlist5)]

pd.concat(list_of_dataframes).to_csv(r'C:\Users\212677036\Documents\output25.csv')

1 Ответ

1 голос
/ 18 июня 2020

После использования DevTools в Firefox / Chrome я создал этот код.

Страница использует другой URL, отправляет разные данные, получает результат с разными ключами.

Вы бы необходимо использовать DevTools, чтобы наблюдать больше запросов от браузера к серверу, чтобы узнать, как использовать больше параметров в data

import requests

query = "mobile"

data = {
#    "facets":[{
#        "name":"OEM",
#        "value":"GE%20Healthcare"
#    }],
    "facets":[],    
    "facilityId": 38451,
    "id_ins": "a2a3d332-73a7-4194-ad87-fe7412388916",
    "limit": 15,
    "query": query,
    "referer": "/catalog/Service",
    "start": 0,
#    "urlParams":[{
#        "name": "OEM",
#        "value": "GE Healthcare"
#    }],
    "urlParams":[]    
}

r = requests.post('https://prodasf-vip.partsfinder.com/Orion/CatalogService/api/v1/search', json=data)
data = r.json()

#print(data['products'])
#print(data['products'][0])
#print(data['products'][0]['options'])
#print(data['products'][0]['options'][0])

print(data['products'][0]['options'][0]['price'])

EDIT (2020.09.01)

Если у вас есть запросы manu, используйте for -l oop, чтобы многократно запускать один и тот же код, но с другим запросом. И когда вы получите данные для одного запроса, используйте for -l oop, чтобы получить все цены из data['products']

EDIT (2020.09.06)

Я добавил переменные start и limit в get_data(), а позже я запустил их в l oop for start in range(0, limit*10, limit), чтобы получить 10 страниц (каждая со 100 элементами)

import requests
# import pprint  # to format data on screen `pprint.pprint()

# --- fucntions ---

def get_data(query, start=0, limit=15): # <-- new (2020.09.06)
    """Get data from server"""
    
    payload = {
    #    "facets":[{
    #        "name":"OEM",
    #        "value":"GE%20Healthcare"
    #    }],
        "facets":[],    
        "facilityId": 38451,
        "id_ins": "a2a3d332-73a7-4194-ad87-fe7412388916",
        "limit": limit,  # <-- new (2020.09.06)
        "query": query,
        "referer": "/catalog/Service",
        "start": start,  # <-- new (2020.09.06)
    #    "urlParams":[{
    #        "name": "OEM",
    #        "value": "GE Healthcare"
    #    }],
        "urlParams":[]    
    }

    r = requests.post('https://prodasf-vip.partsfinder.com/Orion/CatalogService/api/v1/search', json=payload)
    data = r.json()
    
    return data

def show_data(data):
    #print(data['products'])
    #print(data['products'][0])
    #print(data['products'][0]['options'])
    #print(data['products'][0]['options'][0])

    print(data['products'][0]['options'][0]['price'])

    for item in data['products']:
        #pprint.pprint(item)
        print('title:', item['title'])
    
        if not item['options']:
            print('price: unknown')
        else:
            for option in item['options']:
                print('price:', option['price'], '| vendor item number:', option['vendorItemNumber'])

        print('---')
    
def filter_data(data):
    filtered = []
    
    for item in data['products']:
        if not item['options']:
            filtered.append( [] )  # unknown
        else:
            all_prices = [option['price'] for option in item['options']]
            filtered.append( all_prices )
            
    return filtered
    
# --- main ---

all_queries = ["mobile", 'GE Healthcare']

limit = 100  # <-- new (2020.09.06)

for query in all_queries:

    # pagination
    for start in range(0, limit*10, limit): # <-- new (2020.09.06)

        print('\n--- QUERY:', query, 'start:', start, '---\n')

        data = get_data(query, start, limit)
        #show_data(data)

        filtered = filter_data(data)
        print(filtered)
...