Copiar datos de un sitio web dinámico utilizando scrapy

votos
1

Empecé a escribir un raspador para el sitio para recoger datos en los coches. Al final resultó que, la estructura de datos puede cambiar, ya que los vendedores no llenan todos los campos, porque de lo que hay campos que pueden cambiar, y durante el rascador como resultado en el archivo CSV, los valores se encuentran en diferentes campos.

Página de ejemplo:

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

Ejemplo de datos: Ejemplo de datos

Uno de ellos era comprobar el nombre de campo con text () = Category name, pero no estoy seguro de cómo escribir correctamente el resultado de las células correctas.

También utilizo la herramienta integrada de desarrolladores de Google, y con la ayuda del comando document.getElementsByClassName('margintop5')[0].innerText saqué todo el contenido de la tabla, pero los resultados no están estructurados.

Por lo tanto, si la salida puede estar en formato JSON , entonces sería resolver mi problema?

resultado innerText

Además, cuando estudiaba el código de la página, me encontré con una secuencia de comandos JavaScript en la que todos los datos necesarios ya estructurado, pero no sé cómo llegar a ellos.

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

dict datos en JSON

¿Cómo puedo obtener los datos de las páginas utilizando Python y scrapy?

Publicado el 19/09/2018 a las 13:23
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Puede hacerlo mediante la extracción del código JS del <script>bloque, usando una expresión regular para obtener sólo el objeto JS con los datos y luego cargarlo mediante el jsonmódulo:

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

De esta manera, dataes un diccionario de Python que contiene los datos del objeto de JS.

Más acerca del re_firstmétodo aquí: https://doc.scrapy.org/en/latest/topics/selectors.html#using-selectors-with-regular-expressions

Respondida el 19/09/2018 a las 14:26
fuente por usuario

votos
0

Yo diría que usted necesitará:

1) Convertir la clase debajo de C # para una clase Python. (Lo creé usando este post: https://stackoverflow.com/a/48023576/4180382 )

2) Hacer un WebCall de Python para el archivo javascript extraer la cadena JSON usando expresiones regulares (el texto detrás 'GPT.targeting')

3) Convertir la cadena JSON a su clase de Python recién creado.

    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; }
}
Respondida el 19/09/2018 a las 13:59
fuente por usuario

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