Copiar dados de um site dinâmico usando scrapy

votos
1

Eu comecei a escrever um raspador para o site para coletar dados sobre carros. Como se viu, a estrutura de dados pode mudar, já que os vendedores não preencher todos os campos, por causa do que há campos que podem mudar, e durante o raspador como resultado no arquivo CSV, os valores estão em diferentes Campos.

página de exemplo:

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

exemplo dados: Exemplo de dados

Uma abordagem foi a de verificar o nome do campo com text () = Category name, mas eu não tenho certeza de como escrever corretamente o resultado para as células corretas.

Também eu usar o built-in ferramenta de desenvolvedor do Google, e com a ajuda do comando document.getElementsByClassName('margintop5')[0].innerText Eu trouxe todo o conteúdo da tabela, mas os resultados não são estruturados.

Então, se a saída pode ser em formato JSON , em seguida, que iria resolver o meu problema?

resultado innerText

Além disso, quando eu estudei o código da página, me deparei com um script javascript no qual todos os dados necessários já está estruturado, mas eu não sei como obtê-los.

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

dados em Dict json

Como posso obter os dados das páginas usando python e scrapy?

Publicado 19/09/2018 em 13:23
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Você pode fazê-lo, extraindo o código JS do <script>bloco, usando um regex para obter apenas o objeto JS com os dados e, em seguida, carregá-lo usando o jsonmódulo:

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

Desta forma, dataé um dicionário pitão que contém os dados a partir do objecto JS.

Mais sobre o re_firstmétodo aqui: https://doc.scrapy.org/en/latest/topics/selectors.html#using-selectors-with-regular-expressions

Respondeu 19/09/2018 em 14:26
fonte usuário

votos
0

Eu diria que você vai precisar:

1) converter a classe abaixo C # a uma classe pitão. (Eu criei-lo usando este post: https://stackoverflow.com/a/48023576/4180382 )

2) Faça uma webcall de Python para o arquivo javascript extrair a string JSON usando regex (o texto atrás 'GPT.targeting')

3) converter a string JSON para sua classe Python recém-criado.

    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; }
}
Respondeu 19/09/2018 em 13:59
fonte usuário

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