Copier les données d'un site Web dynamique à l'aide scrapy

voix
1

J'ai commencé à écrire un grattoir pour le site pour recueillir des données sur les voitures. En fin de compte, la structure de données peut changer, car les vendeurs ne remplissent pas tous les champs, à cause de ce qu'il y a des champs qui peuvent changer, et pendant le grattoir en conséquence dans le fichier csv, les valeurs sont dans différents des champs.

Exemple de page:

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

Exemple de données: Exemple de données

Une approche était de vérifier le nom du champ avec text () = Category name, mais je ne suis pas sûr de savoir comment écrire correctement le résultat aux cellules correctes.

Aussi j'utilise l'outil de développement Google intégrées, et avec l'aide de la commande que document.getElementsByClassName('margintop5')[0].innerText je fait sortir tout le contenu de la table, mais les résultats ne sont pas structurés.

Ainsi, si la sortie peut être en format JSON il serait alors résoudre mon problème?

résultat innerText

De plus, lorsque j'ai étudié le code de la page, je suis tombé sur un script javascript dans lequel toutes les données nécessaires sont déjà structurées, mais je ne sais pas comment les obtenir.

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

données en json dict

Comment puis-je obtenir les données des pages en utilisant python et scrapy?

Créé 19/09/2018 à 13:23
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
2

Vous pouvez le faire en extraire le code JS du <script>bloc, en utilisant une expression régulière pour obtenir seulement l'objet JS avec les données, puis le charger à l' aide du jsonmodule de :

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

De cette façon, dataest un dict python contenant les données de l'objet JS.

En savoir plus sur la re_firstméthode ici: https://doc.scrapy.org/en/latest/topics/selectors.html#using-selectors-with-regular-expressions

Créé 19/09/2018 à 14:26
source utilisateur

voix
0

Je dirais que vous devez:

1) Convertir le ci - dessous la classe C # à une classe de python. (Je l' ai créé en utilisant ce post: https://stackoverflow.com/a/48023576/4180382 )

2) Faire un webcall de Python dans le fichier javascript extraire la chaîne JSON utilisant l'expression rationnelle (le texte derrière « GPT.targeting »)

3) Convertir la chaîne JSON à votre classe Python nouvellement créé.

    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; }
}
Créé 19/09/2018 à 13:59
source utilisateur

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