Копирование данных с динамического веб-сайта с использованием scrapy - PullRequest
0 голосов
/ 19 сентября 2018

Я начал писать скребок для сайта для сбора данных об автомобилях.Как оказалось, структура данных может измениться, поскольку продавцы не заполняют все поля, из-за чего появляются поля, которые могут меняться, а во время скребка в результате в файле 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 result

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

                 <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"};

данные в jsondict

Как я могу получить данные со страниц, используя python и scrapy?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вы можете сделать это, извлекая код 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

0 голосов
/ 19 сентября 2018

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

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

2) Сделайте веб-звонок из Python в файл javascript, извлекая строку json, используя regex (текст за «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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...