Копирование данных из динамического веб-сайта с использованием Scrapy

голоса
1

Я начал писать скребок для сайта для сбора данных на автомобилях. Как выяснилось, структура данных может меняться, так как продавцы не заполнять все поля, из-за того, что есть поля, которые могут изменить, и во скребке в результате в файле CSV, значение в разном поля.

Пример страницы:

https://www.olx.ua/obyavlenie/prodam-voikswagen-touran-2011-goda-IDBzxYq.html#87fcf09cbd

https://www.olx.ua/obyavlenie/fiat-500-1-4-IDBjdOc.html#87fcf09cbd

Пример данных: Пример данных

Один из подходов заключается в проверке имени поля с text () = Category name, но я не знаю , как правильно записать результат на правильные клетки.

Также я использую встроенный в Google инструмент для разработчиков, так и с помощью команды document.getElementsByClassName('margintop5')[0].innerText я вывел все содержимое таблицы, но результаты не структурированы.

Таким образом, если выход может быть в формате JSON , то было бы решить мою проблему?

InnerText результат

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

                 <script type=text/javascript>
                var GPT = GPT || {};
                GPT.targeting = {cat_l0:transport,cat_l1:legkovye-avtomobili,cat_l2:volkswagen,cat_l0_id:1532,cat_l1_id:108,cat_l2_id:1109,ad_title:volkswagen-jetta,ad_img:https:\/\/img01-olxua.akamaized.net\/img-olxua\/676103437_1_644x461_volkswagen-jetta-kiev.jpg,offer_seek:offer,private_business:private,region:ko,subregion:kiev,city:kiev,model:[jetta],modification:[],motor_year:[2006],car_body:[sedan],color:[6],fuel_type:[543],motor_engine_size:[1751-2000],transmission_type:[546],motor_mileage:[175001-200000],condition:[first-owner],car_option:[air_con,climate-control,cruise-control,electric_windows,heated-seats,leather-interior,light-sensor,luke,on-board-computer,park_assist,power-steering,rain-sensor],multimedia:[acoustics,aux,cd],safety:[abs,airbag,central-locking,esp,immobilizer,servorul],other:[glass-tinting],cleared_customs:[no],price:[3001-5000],ad_price:4500,currency:USD,safedealads:,premium_ad:0,imported:0,importer_code:,ad_type_view:normal,dfp_user_id:e3db0bed-c3c9-98e5-2476-1492de8f5969-ver2,segment:[],dfp_segment_test:76,dfp_segment_test_v2:46,dfp_segment_test_v3:46,dfp_segment_test_v4:32,adx:[bda2p24,bda1p24,bdl2p24,bdl1p24],comp:[o12],lister_lifecycle:0,last_pv_imps:2,user-ad-fq:2,ses_pv_seq:1,user-ad-dens:2,listingview_test:1,env:production,url_action:ad,lang:ru,con_inf:transportxxlegkovye-avtomobilixx46};

данные в формате JSON Dict

Как я могу получить данные из страниц с помощью питона и Scrapy?

Задан 19/09/2018 в 13:23
источник пользователем
На других языках...                            


2 ответов

голоса
2

Вы можете сделать это путем извлечения кода JS из <script>блока, используя регулярное выражение , чтобы получить только объект JS с данными , а затем загрузить его с помощью jsonмодуля:

query = 'script:contains("GPT.targeting = ")::text'
js_code = response.css(query).re_first('targeting = ({.*});')
data = json.loads(js_code)

Таким образом, dataявляется Python ДИКТ , содержащий данные из объекта JS.

Подробнее о re_firstметоде здесь: https://doc.scrapy.org/en/latest/topics/selectors.html#using-selectors-with-regular-expressions

Ответил 19/09/2018 d 14:26
источник пользователем

голоса
0

Я бы сказал, что вам нужно:

1) Преобразовать ниже C # класса к классу питона. (Я создал его , используя этот пост: https://stackoverflow.com/a/48023576/4180382 )

2) Сделать webcall из Python в файл JavaScript извлечение строки JSON с использованием регулярных выражений (текст за «GPT.targeting»)

3) Преобразование строки JSON в вновь созданный класс Python.

    public class Rootobject
{
    public string cat_l0 { get; set; }
    public string cat_l1 { get; set; }
    public string cat_l2 { get; set; }
    public string cat_l0_id { get; set; }
    public string cat_l1_id { get; set; }
    public string cat_l2_id { get; set; }
    public string ad_title { get; set; }
    public string ad_img { get; set; }
    public string offer_seek { get; set; }
    public string private_business { get; set; }
    public string region { get; set; }
    public string subregion { get; set; }
    public string city { get; set; }
    public string[] model { get; set; }
    public object[] modification { get; set; }
    public int[] motor_year { get; set; }
    public string[] car_body { get; set; }
    public string[] color { get; set; }
    public string[] fuel_type { get; set; }
    public string[] motor_engine_size { get; set; }
    public string[] transmission_type { get; set; }
    public string[] motor_mileage { get; set; }
    public string[] condition { get; set; }
    public string[] car_option { get; set; }
    public string[] multimedia { get; set; }
    public string[] safety { get; set; }
    public string[] other { get; set; }
    public string[] cleared_customs { get; set; }
    public string[] price { get; set; }
    public string ad_price { get; set; }
    public string currency { get; set; }
    public string safedealads { get; set; }
    public string premium_ad { get; set; }
    public string imported { get; set; }
    public string importer_code { get; set; }
    public string ad_type_view { get; set; }
    public string dfp_user_id { get; set; }
    public object[] segment { get; set; }
    public string dfp_segment_test { get; set; }
    public string dfp_segment_test_v2 { get; set; }
    public string dfp_segment_test_v3 { get; set; }
    public string dfp_segment_test_v4 { get; set; }
    public string[] adx { get; set; }
    public string[] comp { get; set; }
    public string lister_lifecycle { get; set; }
    public string last_pv_imps { get; set; }
    public string useradfq { get; set; }
    public string ses_pv_seq { get; set; }
    public string useraddens { get; set; }
    public string listingview_test { get; set; }
    public string env { get; set; }
    public string url_action { get; set; }
    public string lang { get; set; }
    public string con_inf { get; set; }
}
Ответил 19/09/2018 d 13:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more