python 如何网页剪贴本页,并把它变成一个csv文件?

q0qdq0h2  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(112)

我的名字是João,我是一个来自巴西的法律系学生,我是新来的。我试图在网上刮这个页面一个星期,以帮助我与本科生论文和其他研究人员。
我想做一个csv文件与所有的研究结果在法院(this link)。正如你可以看到在链接中,有404个结果(processo)分为41页。每个结果有它自己的html与它的信息(如在一个市场)。
结果html分为两个主要表。第一个表包含结果的一般信息,并且可能在所有结果中具有相同的结构。第二个表包含结果文件(它们是管理过程中的决定),其可能在文件数量上改变,甚至具有具有相同名称的一些文件,但日期不同。从这第二个表我只需要链接到最古老的“relatório/voto”和它的日期和链接到最古老的“acórdão”和它的日期。
csv文件的头应类似于下图,每个结果应为一行。x1c 0d1x
我在google colab上使用python,我尝试了很多方法来抓取,但是效果不好。我最完整的方法是当我尝试改编一个产品抓取教程时:video和对应的code in Github
我的修改在colab中不起作用,它既不会导致错误消息,也不会在csv文件中。在下面的代码中,我通过比较页面和课程发现了一些修改中的问题,它们是:
1.虽然提取的结果html的41页之一,我相信我应该创建一个列表的结果html提取,但它提取的文本太多,我不知道如何纠正它。
1.当我试图从结果HTML中提取数据时,我失败了。每当我试图用这些创建一个列表时,它只返回给我一个结果。
1.除了教程,我还想从结果html中的第二个表中提取数据,它将是指向最早的“relatório/voto”及其日期的链接,以及指向最早的“acórdão”及其日期的链接。我不知道如何以及何时在代码中应该这样做。

修改代码

from requests_html import HTMLSession
import csv

s = HTMLSession()

# STEP 01: take the result html

def get_results_links(page):
  url = f"https://www.tce.sp.gov.br/jurisprudencia/pesquisar?txtTdPalvs=munic%C3%ADpio+pessoal+37&txtExp=temporari&txtQqUma=admiss%C3%A3o+contrata%C3%A7%C3%A3o&txtNenhPalvs=&txtNumIni=&txtNumFim=&tipoBuscaTxt=Documento&_tipoBuscaTxt=on&quantTrechos=1&processo=&exercicio=&dataAutuacaoInicio=&dataAutuacaoFim=&dataPubInicio=01%2F01%2F2021&dataPubFim=31%2F12%2F2021&_relator=1&_auditor=1&_materia=1&tipoDocumento=2&_tipoDocumento=1&acao=Executa&offset={page}"
  links = []
  r = s.get(url)
  results = r.html.find('td.small a')
  for item in results:
    links.append(item.find('a', first=True).attrs['href']) #Problem 01: I believe it should creat a list of the results html extracted out the page, but it extracted the text too.
  return links

# STEP 02: extracting relevant information from the result html before extracted

def parse_result(url):
    r = s.get(url)
    numero = r.html.find('td.small', first=True).text.strip()
    data_autuacao = r.html.find('td.small', first=True).text.strip()
    try:
      parte_1 = r.html.find('td.small', first=True).text.strip()
    except AttributeError as err:
      sku = 'Não há'
    try:
      parte_2 = r.html.find('td.small', first=True).text.strip()
    except AttributeError as err:
      parte_2 = 'Não há'
    materia = r.html.find('td.small', first=True).text.strip()
    exercicio = r.html.find('td.small', first=True).text.strip()
    objeto = r.html.find('td.small', first=True).text.strip()
    relator = r.html.find('td.small', first=True).text.strip()
    #Problem 02
# STEP 03: creating a list based objetcs created before
    product = {
        'Nº do Processo': numero,
        "Link do Processo" : r,
        'Data de Autuação': data_autuacao,
        'Parte 1': parte_1,
        'Parte 2': parte_2,
        'Exercício': exercicio,
        'Matéria' : materia,
        'Objeto' : objeto,
        'Relator' : relator
        #'Relatório/Voto' :
        #'Data Relatório/Voto' :
        #'Acórdão' :
        #'Data Acórdão' :
    }#Problem 03
    return product

# STEP 04: saving as csv
def save_csv(final):
    keys = final [0].keys()

    with open('products.csv', 'w') as f:
        dict_writer = csv.DictWriter(f, keys)
        dict_writer.writeheader()
        dict_writer.writerows(final)

# STEP 05: main - joinning the functions
def main():
    final = []
    for x in range(0, 410, 10):
        print('Getting Page ', x)
        urls = get_results_links(x)
        for url in urls:
            final.append(parse_result(url))
        print('Total: ', len(final))
        save_csv(final)

谢谢你,@shelter,到目前为止你的帮助。我试着具体说明一下。

ej83mcc0

ej83mcc01#

有更好的方法(虽然更复杂)来获取这些信息,比如scrapy或者async解决方案。尽管如此,这里有一种方法可以获取你想要的信息,并将其保存到csv文件中。我只抓取了前2页(20个结果),如果你愿意,可以增加范围:

from bs4 import BeautifulSoup as bs
import requests
from tqdm.notebook import tqdm
import pandas as pd

pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
}

s = requests.Session()
s.headers.update(headers)

big_list = []
detailed_list = []
for x in tqdm(range(0, 20, 10)):
    url = f'https://www.tce.sp.gov.br/jurisprudencia/pesquisar?txtTdPalvs=munic%C3%ADpio+pessoal+37&txtExp=temporari&txtQqUma=admiss%C3%A3o+contrata%C3%A7%C3%A3o&txtNenhPalvs=&txtNumIni=&txtNumFim=&tipoBuscaTxt=Documento&_tipoBuscaTxt=on&quantTrechos=1&processo=&exercicio=&dataAutuacaoInicio=&dataAutuacaoFim=&dataPubInicio=01%2F01%2F2021&dataPubFim=31%2F12%2F2021&_relator=1&_auditor=1&_materia=1&tipoDocumento=2&_tipoDocumento=1&acao=Executa&offset={x}'
    r = s.get(url)
    urls = bs(r.text, 'html.parser').select('tr[class="borda-superior"] td:nth-of-type(2) a')
    big_list.extend(['https://www.tce.sp.gov.br/jurisprudencia/' + x.get('href') for x in urls])
for x in tqdm(big_list):
    r = s.get(x)
    soup = bs(r.text, 'html.parser')
    n_proceso = soup.select_one('td:-soup-contains("N° Processo:")').find_next('td').text if soup.select('td:-soup-contains("N° Processo:")') else None
    link_proceso = x
    autoacao = soup.select_one('td:-soup-contains("Autuação:")').find_next('td').text if soup.select('td:-soup-contains("Autuação:")') else None
    parte_1 = soup.select_one('td:-soup-contains("Parte 1:")').find_next('td').text if soup.select('td:-soup-contains("Parte 1:")') else None
    parte_2 = soup.select_one('td:-soup-contains("Parte 2:")').find_next('td').text if soup.select('td:-soup-contains("Parte 2:")') else None
    materia = soup.select_one('td:-soup-contains("Matéria:")').find_next('td').text if soup.select('td:-soup-contains("Matéria:")') else None
    exercicio = soup.select_one('td:-soup-contains("Exercício:")').find_next('td').text if soup.select('td:-soup-contains("Exercício:")') else None
    objeto = soup.select_one('td:-soup-contains("Objeto:")').find_next('td').text if soup.select('td:-soup-contains("Objeto:")') else None
    relator = soup.select_one('td:-soup-contains("Relator:")').find_next('td').text if soup.select('td:-soup-contains("Relator:")') else None
    relatorio_voto = soup.select_one('td:-soup-contains("Relatório / Voto ")').find_previous('a').get('href') if soup.select('td:-soup-contains("Relatório / Voto")') else None
    data_relatorio = soup.select_one('td:-soup-contains("Relatório / Voto ")').find_previous('td').text if soup.select('td:-soup-contains("Relatório / Voto")') else None
    acordao = soup.select_one('td:-soup-contains("Acórdão ")').find_previous('a').get('href') if soup.select('td:-soup-contains("Acórdão ")') else None
    data_acordao = soup.select_one('td:-soup-contains("Acórdão ")').find_previous('td').text if soup.select('td:-soup-contains("Acórdão ")') else None
    detailed_list.append((n_proceso, link_proceso, autoacao, parte_1, parte_2, 
                          materia, exercicio, objeto, relator, relatorio_voto, 
                          data_relatorio, acordao, data_acordao))
detailed_df = pd.DataFrame(detailed_list, columns = ['n_proceso', 'link_proceso', 'autoacao', 'parte_1', 
                                                     'parte_2', 'materia', 'exercicio', 'objeto', 'relator', 
                                                     'relatorio_voto', 'data_relatorio', 'acordao', 'data_acordao'])
display(detailed_df) 
detailed_df.to_csv('legal_br_stuffs.csv')

终端结果:

100%
2/2 [00:04<00:00, 1.78s/it]
100%
20/20 [00:07<00:00, 2.56it/s]
n_proceso   link_proceso    autoacao    parte_1 parte_2 materia exercicio   objeto  relator relatorio_voto  data_relatorio  acordao data_acordao
0   18955/989/20    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=18955/989/20&offset=0  31/07/2020  ELVES SCIARRETTA CARREIRA   PREFEITURA MUNICIPAL DE BRODOWSKI   RECURSO ORDINARIO   2020    Recurso Ordinário Protocolado em anexo. EDGARD CAMARGO RODRIGUES    https://www2.tce.sp.gov.br/arqs_juri/pdf/801385.pdf 20/01/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/801414.pdf 20/01/2021
1   13614/989/18    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=13614/989/18&offset=0  11/06/2018  PREFEITURA MUNICIPAL DE SERRA NEGRA     RECURSO ORDINARIO   2014    Recurso Ordinário   ANTONIO ROQUE CITADINI  https://www2.tce.sp.gov.br/arqs_juri/pdf/797986.pdf 05/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/800941.pdf 05/02/2021
2   6269/989/19 https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=6269/989/19&offset=0   19/02/2019  PREFEITURA MUNICIPAL DE TREMEMBE        ADMISSAO DE PESSOAL - CONCURSO PROCESSO SELETIVO    2018    INTERESSADO: Rafael Varejão Munhos e outros. EDITAL Nº: 01/2017. CONCURSO PÚBLICO: 01/2017. None    https://www2.tce.sp.gov.br/arqs_juri/pdf/804240.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804258.pdf 06/02/2021
3   14011/989/19    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=14011/989/19&offset=0  11/06/2019  RUBENS EDUARDO DE SOUZA AROUCA  PREFEITURA MUNICIPAL DE TREMEMBE    RECURSO ORDINARIO   2019    Recurso Ordinário   RENATO MARTINS COSTA    https://www2.tce.sp.gov.br/arqs_juri/pdf/804240.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804258.pdf 06/02/2021
4   14082/989/19    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=14082/989/19&offset=0  12/06/2019  PREFEITURA MUNICIPAL DE TREMEMBE        RECURSO ORDINARIO   2019    Recurso Ordinário nos autos do TC n° 6269.989.19 - Admissão de pessoal - Concurso Público   RENATO MARTINS COSTA    https://www2.tce.sp.gov.br/arqs_juri/pdf/804240.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804258.pdf 06/02/2021
5   14238/989/19    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=14238/989/19&offset=0  13/06/2019  MARCELO VAQUELI PREFEITURA MUNICIPAL DE TREMEMBE    RECURSO ORDINARIO   2019    Recurso Ordinário   RENATO MARTINS COSTA    https://www2.tce.sp.gov.br/arqs_juri/pdf/804240.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804258.pdf 06/02/2021
6   14141/989/20    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=14141/989/20&offset=0  28/05/2020  PREFEITURA MUNICIPAL DE BIRIGUI CRISTIANO SALMEIRAO RECURSO ORDINARIO   2018    Recurso Ordinário   RENATO MARTINS COSTA    https://www2.tce.sp.gov.br/arqs_juri/pdf/804259.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804262.pdf 06/02/2021
7   15371/989/19    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=15371/989/19&offset=0  02/07/2019  PREFEITURA MUNICIPAL DE BIRIGUI     ADMISSAO DE PESSOAL - TEMPO DETERMINADO 2018    INTERESSADOS: ADRIANA PEREIRA CRISTAL E OUTROS. PROCESSOS SELETIVOS/EDITAIS Nºs:002/2016, 004/2017, 05/2017, 06/2017,001/2018 e 002/2018. LEIS AUTORIZADORAS: Nº 5134/2009 e Nº 3946/2001.  None    https://www2.tce.sp.gov.br/arqs_juri/pdf/804259.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804262.pdf 06/02/2021
8   15388/989/20    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=15388/989/20&offset=0  04/06/2020  MARIA ANGELICA MIRANDA FERNANDES        RECURSO ORDINARIO   2018    Recurso Ordinário   RENATO MARTINS COSTA    https://www2.tce.sp.gov.br/arqs_juri/pdf/804259.pdf 06/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804262.pdf 06/02/2021
9   12911/989/16    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=12911/989/16&offset=0  20/07/2016  MARCELO CANDIDO DE SOUZA    PREFEITURA MUNICIPAL DE SUZANO  RECURSO ORDINARIO   2016    Recurso Ordinário Ref. Atos de Admissão de Pessoal - Exercício 2012. objetivando o preenchimento temporário dos cargos de Médico Cardiologista 20h, Fotógrafo, Médico Clínico Geral 20lt, Médico Gineco DIMAS RAMALHO   https://www2.tce.sp.gov.br/arqs_juri/pdf/814599.pdf 27/04/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/814741.pdf 27/04/2021
10  1735/002/11 https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=1735/002/11&offset=10  22/11/2011  FUNDACAO DE APOIO AOS HOSP VETERINARIOS DA UNESP        ADMISSAO DE PESSOAL - TEMPO DETERMINADO 2010    ADMISSAO DE PESSOAL POR TEMPO DETERMINADO COM CONCURSO/PROCESSO SELETIVO    ANTONIO ROQUE CITADINI  https://www2.tce.sp.gov.br/arqs_juri/pdf/800893.pdf 21/01/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/800969.pdf 21/01/2021
11  23494/989/18    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=23494/989/18&offset=10 20/11/2018  HAMILTON LUIS FOZ       RECURSO ORDINARIO   2018    Recurso Ordinário   DIMAS RAMALHO   https://www2.tce.sp.gov.br/arqs_juri/pdf/816918.pdf 13/05/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/817317.pdf 13/05/2021
12  24496/989/19    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=24496/989/19&offset=10 25/11/2019  PREFEITURA MUNICIPAL DE LORENA      RECURSO ORDINARIO   2017    Recurso Ordinário em face de sentença proferida nos autos de TC 00006265.989.19-4   DIMAS RAMALHO   https://www2.tce.sp.gov.br/arqs_juri/pdf/814660.pdf 27/04/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/814805.pdf 27/04/2021
13  17110/989/18    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=17110/989/18&offset=10 03/08/2018  JORGE ABISSAMRA PREFEITURA MUNICIPAL DE FERRAZ DE VASCONCELOS   RECURSO ORDINARIO   2018    Recurso Ordinário   DIMAS RAMALHO   https://www2.tce.sp.gov.br/arqs_juri/pdf/814633.pdf 27/04/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/814774.pdf 27/04/2021
14  24043/989/19    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=24043/989/19&offset=10 18/11/2019  PREFEITURA MUNICIPAL DE IRAPURU     RECURSO ORDINARIO   2018    Recurso ordinário   ROBSON MARINHO  https://www2.tce.sp.gov.br/arqs_juri/pdf/817014.pdf 12/05/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/817269.pdf 12/05/2021
15  2515/989/20 https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=2515/989/20&offset=10  03/02/2020  PREFEITURA MUNICIPAL DE IPORANGA        RECURSO ORDINARIO   2020    Recurso interposto em face da sentença proferida nos autos do TC 15791/989/19-7.    ROBSON MARINHO  https://www2.tce.sp.gov.br/arqs_juri/pdf/817001.pdf 12/05/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/817267.pdf 12/05/2021
16  1891/989/20 https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=1891/989/20&offset=10  24/01/2020  PREFEITURA MUNICIPAL DE IPORANGA        RECURSO ORDINARIO   2020    RECURSO ORDINÁRIO   DIMAS RAMALHO   https://www2.tce.sp.gov.br/arqs_juri/pdf/802484.pdf 03/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/802620.pdf 03/02/2021
17  15026/989/20    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=15026/989/20&offset=10 02/06/2020  DIXON RONAN CARVALHO    PREFEITURA MUNICIPAL DE PAULINIA    RECURSO ORDINARIO   2018    RECURSO ORDINÁRIO   ANTONIO ROQUE CITADINI  https://www2.tce.sp.gov.br/arqs_juri/pdf/802648.pdf 05/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/803361.pdf 05/02/2021
18  9070/989/20 https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=9070/989/20&offset=10  09/03/2020  PREFEITURA MUNICIPAL DE FLORIDA PAULISTA        RECURSO ORDINARIO   2017    Recurso Ordinário   ROBSON MARINHO  https://www2.tce.sp.gov.br/arqs_juri/pdf/817006.pdf 12/05/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/817296.pdf 12/05/2021
19  21543/989/20    https://www.tce.sp.gov.br/jurisprudencia/exibir?proc=21543/989/20&offset=10 11/09/2020  PREFEITURA MUNICIPAL DE JERIQUARA       RECURSO ORDINARIO   2020    RECURSO ORDINÁRIO   SIDNEY ESTANISLAU BERALDO   https://www2.tce.sp.gov.br/arqs_juri/pdf/802997.pdf 13/02/2021  https://www2.tce.sp.gov.br/arqs_juri/pdf/804511.pdf 13/02/2021

如果你在职业生涯中需要编码,我强烈建议你先开始积累一些基础知识,然后再尝试编码或改编其他代码。

相关问题