Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Canoas/RS #10

Closed
lucasrcezimbra opened this issue Apr 20, 2018 · 12 comments · Fixed by #290
Closed

Canoas/RS #10

lucasrcezimbra opened this issue Apr 20, 2018 · 12 comments · Fixed by #290

Comments

@lucasrcezimbra
Copy link
Contributor

lucasrcezimbra commented Apr 20, 2018

Comecei a fazer o crawler de Canoas/RS, porém encontrei alguns problemas. O site do diário de Canoas não disponibiliza link direto para o PDF, ao invés disso usa cookie e sessão para o acesso e isso complica um pouco as coisas.

Como funciona:
Quando é acessado o site e escolhido o diário que deseja acessar, são feitas algumas requisições para o servidor com o dia e as páginas escolhidos. E então retorna o arquivo PDF. Caso acesse diretamente o link do arquivo, o server verifica a sessão e retorna o PDF escolhido nas requisições anteriores ou 404. Não existe um caminho único para o arquivo, o link é o mesmo para todos os arquivos, o que muda é só a data e páginas setados na sessão.

Então é necessário manter uma sessão única para cada dia do diário, pelo que eu vi é possivel fazer isso com o Scrapy. Porém, no projeto atualmente é rodado o crawler que pega todos os diários e as URLs dos arquivos e depois passa para a próxima pipeline que baixa os arquivos. Porém acredito que nessa troca de pipeline não se mantenha os cookies e a sessão e como nesse caso seria necessário manter a sessão para fazer o download, creio que não funcionaria. Qual vcs acham que é a melhor forma de resolver isso?

Outro problema é que não teremos o link direto para o arquivo do diário como temos de Porto Alegre.

@stefersonferreira
Copy link

Comecei a fazer o crawler para a prefeitura de São Luis, no site deles também é feito de forma dinâmica a geração dos links para os pdfs, é aparentemente mais fácil que essa tua situação.

Tentei usando o Scrapy Splash, mas ainda não obtive sucesso, fico tendo o e retorno do erro 405.

Observa que tem uma branch que traz um exemplo, porém o caso do exemplo é mais simples do que necessita para o diário de São Luis.

https://github.com/scrapy-plugins/scrapy-splash

Site slz: http://sistemas.semad.saoluis.ma.gov.br:8090/easysearch/

@cuducos
Copy link
Contributor

cuducos commented Apr 25, 2018

O site do diário de Canoas não disponibiliza link direto para o PDF, ao invés disso usa cookie e sessão para o acesso e isso complica um pouco as coisas.

Você conseguiu mapear os cookies que são utilizados? E o que fica na sessão?

Vi algumas alternativas para manter/passar esses dados para os scrapy.Requests, mas sinto que preciso de mais detalhes para ter uma ideia melhor se vai ou não resolver (principalmente pois li que manter os cookies já é o padrão do Scrapy).

@lucasrcezimbra
Copy link
Contributor Author

lucasrcezimbra commented Apr 26, 2018

Você conseguiu mapear os cookies que são utilizados? E o que fica na sessão?

O cookie utilizado é o que salva a sessão JSESSIONID. Também é enviado o parâmetro javax.faces.ViewState nas requisições que é único para cada sessão, depois do primeiro acesso é recebido e tem que ser enviado nas próximas requisições.

Acredito que o Scrapy mantenha os cookies durante as requisições, mas seria necessário também manter ao trocar de pipeline, pois para fazer o download do arquivo (que é a 2ª pipeline) é necessário estar com a mesma sessão aberta.

@lucasrcezimbra
Copy link
Contributor Author

Outra alternativa seria fazer o download diretamente na primeira pipeline e não executar a pipeline de download, mas não sei as desvantagens disso. O que vcs acham?

@stefersonferreira
Copy link

stefersonferreira commented Apr 26, 2018

Tentando utilizar a chamada do request dessa forma:

` headers = {
'Host': 'sistemas.semad.saoluis.ma.gov.br:8090',
'Connection': 'keep-alive',
'Content-Length': '4368',
'X-GWT-Module-Base': 'http://sistemas.semad.saoluis.ma.gov.br:8090/easysearch/easysearch_searchview/',
'X-GWT-Permutation': 'B181051701168DEC9F77BD8F1D51DFCD',
'Origin': 'http://sistemas.semad.saoluis.ma.gov.br:8090',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'Content-Type': 'text/x-gwt-rpc; charset=UTF-8',
'Accept': '/',
'Referer': 'http://sistemas.semad.saoluis.ma.gov.br:8090/easysearch/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
'Cookie': 'es-xuid=8f6c4097-b29a-4075-b666-e024b3168f58; warningShown=1; JSESSIONID=6d6c322f-6fdd-4c81-a7d7-e3bf10263113; _ga=GA1.4.1470687327.1519405402',
}

    data = "7|0|68|http://sistemas.semad.saoluis.ma.gov.br:8090/easysearch/easysearch_searchview/|39DA7FE6E21AADE8C06FBA64A74B9DD9|br.com.dataeasy.easysearch.client.core.ManagerService|execute|br.com.dataeasy.easysearch.client.core.ClientCommand|br.com.dataeasy.easysearch.client.command.SearchRequestCmd/365718362|default|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest/182647667|java.util.ArrayList/4159755760|java.util.HashMap/1797211028|java.lang.String/2004016611|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$ProjectField|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$ProjectField/1523921243|Data do diário|br.com.dataeasy.easysearch.shared.imp.TypeSupport/2084692144|Download|Número do diário|Suplemento|Visualizar|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$HlField|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$HlField/2000415408|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$HlFragSize|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$HlFragSize/4076120198|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetMinCount|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetMinCount/1503396037|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetLimit|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetLimit/2004551114|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetTaxonomy|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetTaxonomy/1542976096||br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$PagingFrom|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$PagingFrom/2644311692|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$PageSize|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$PageSize/4271829286|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetFieldByExclude|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetFieldByExclude/4260176092|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetOffsetField|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetOffsetField/4030967082|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetLimitField|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetLimitField/3266405597|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetSortField|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetSortField/2435273722|br.com.dataeasy.easysearch.shared.imp.FacetSortMode/4255894897|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetQueryByFilterLabel|br.com.dataeasy.easysearch.shared.imp.SerialSearchRequest$FacetQueryByFilterLabel/3534346405|Diário Oficial - De Hoje|br.com.dataeasy.easysearch.shared.imp.EvaluatorQuery/2658882158|${field:Data do diário}:(NOW/DAY)|tag1|Diário Oficial - Últimos 7 dias|${field:Data do diário}:[NOW/DAY-7DAYS TO NOW/DAY]|tag2|Diário Oficial - Do Mês|${field:Data do diário}:[NOW/MONTH TO NOW/DAY]|tag3|Diário Oficial - Do Ano|${field:Data do diário}:[NOW/YEAR TO NOW/DAY]|tag4|*:*|br.com.dataeasy.easysearch.shared.imp.EdismaxQueryParser/3317989970| boost=recip(ms(NOW/HOUR,api_Data_do_diário_dt),3.16E-11,1.9625000000000004,0.9812500000000002)| mm='3<-1 6<80%| ps=8| ps2=4| ps3=4| qs=0| tie=0.10000000149011612|edismax|1|2|3|4|1|5|6|7|8|9|0|0|10|13|11|12|9|5|13|14|15|10|13|16|15|14|13|17|15|5|13|18|-12|13|19|15|15|11|20|9|5|21|14|-8|21|16|-10|21|17|-12|21|18|-12|21|19|-15|11|22|9|1|23|250|11|24|9|1|25|1|11|26|9|1|27|12|11|28|9|1|29|2147483647|30|11|31|9|1|32|300|11|33|9|1|34|100|11|35|9|2|36|0|14|14|-8|36|0|18|18|-12|11|37|9|2|38|14|0|-8|38|18|0|-12|11|39|9|2|40|14|2147483647|-8|40|18|12|-12|11|41|9|2|42|14|-8|43|1|42|18|-12|-56|11|44|9|4|45|46|47|48|0|49|0|45|50|47|51|0|52|0|45|53|47|54|0|55|0|45|56|47|57|0|58|0|1|59|60|30|61|30|62|30|30|30|1|63|64|65|30|66|1|67|0|0|68|0|1|0|"



    yield scrapy.Request(url=ma_sao_luis_url, callback=self.parse_page, method='POST', headers=headers, body=data, encoding='utf-8')

`

Porém não obtenho o retorno esperado e sim:

2018-04-26 12:46:52 [scrapy.core.engine] DEBUG: Crawled (405) <GET http://sistemas.semad.saoluis.ma.gov.br:8090/easysearch/easysearch_searchview/gwtengine> (referer: None) 2018-04-26 12:46:52 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <405 http://sistemas.semad.saoluis.ma.gov.br:8090/easysearch/easysearch_searchview/gwtengine>: HTTP status code is not handled or not allowed

@rennerocha
Copy link
Member

rennerocha commented May 16, 2018

Os requests para fazer o download dos arquivos são definidos em
scrapy.pipelines.files.FilesPipeline (https://doc.scrapy.org/en/latest/topics/media-pipeline.html#using-the-files-pipeline) no método get_media_requests.

class FilesPipeline(MediaPipeline):
    ### Overridable Interface
    def get_media_requests(self, item, info):
        return [Request(x) for x in item.get(self.files_urls_field, [])]

Você pode criar um pipeline customizado (https://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own-item-pipeline) baseado no FilesPipeline e redefinir os requests, passando as informações de sessão que você precisa:

class MyCustomFilePipelineForCanoas(FilesPipeline):

    def get_media_requests(self, item, info):
        requests = []
        for x in item.get(self.files_urls_field, []):
            headers = item.get('headers')  # Vc pode colocar essa informação no item e depois removê-la
            requests.append(Request(x, headers=headers))
        return requests

Se precisar de ajuda, coloque o link do PR em desenvolvimento que tento ver se consigo ajudar mais.

@lucasrcezimbra
Copy link
Contributor Author

Entendi. Valeu @rennerocha. Vou tentar tentar dessa forma.

O link que tenho é só de alguns testes que fiz com o requests mesmo: https://gist.github.com/Lrcezimbra/49a8cb3135e4f043212ab9976b3f56a7. Vou escrever com Scrapy e qualquer coisa comento aqui.

@jeffersoncardoso
Copy link

Boa noite,

a partir de 29/05 a Prefeitura de Canoas está utilizando um novo sistema de Diário Oficial (http://sistemas.canoas.rs.gov.br/domc/), acredito ser bem mais simples fazer o crawler com o novo sistema, uma vez que existem rotas pré definidas para acesso aos arquivos das publicações.

Quando as publicações anteriores, está sendo estudado a possibilidade de migração, mas por enquanto está no diário antigo

Faço parte da equipe de Desenvolvimento do sistema, portanto alguma dúvida estou a disposição.

@lucasrcezimbra
Copy link
Contributor Author

Legal @jeffersoncardoso. Valeu por compartilhar.

Vou escrever o crawler para esse sistema novo então, se migrarem os antigos para esse, melhor. Se não vemos para escrever para um crawler para o antigo também.

@rennerocha
Copy link
Member

@jeffersoncardoso , como você está na equipe de desenvolvimento, será que não existe alguma maneira de vocês disponibilizarem essa informação de uma maneira mais simples?

@rennerocha
Copy link
Member

Como a prefeitura de Canoas disponibiliza os DOs antigos em outro sistema, acredito que precisamos que eles sejam obtidos também. Criar um método de parse para as edições antigas, utilizando o código existente é o ideal.

@vitorbaptista
Copy link
Member

Eu atualizei o PR, fazendo o merge com o último código no main. O PR com o código atualizado está em #290.

@jeffersoncardoso Você teria como gerar uma lista das URLs de todos os Diários Oficiais que estão no sistema antigo? Assim a gente conseguiria baixar tudo, sem precisar fazer outro spider.

@jvanz jvanz closed this as completed in #290 Nov 2, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants