我的名字是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,到目前为止你的帮助。我试着具体说明一下。
1条答案
按热度按时间ej83mcc01#
有更好的方法(虽然更复杂)来获取这些信息,比如scrapy或者async解决方案。尽管如此,这里有一种方法可以获取你想要的信息,并将其保存到csv文件中。我只抓取了前2页(20个结果),如果你愿意,可以增加范围:
终端结果:
如果你在职业生涯中需要编码,我强烈建议你先开始积累一些基础知识,然后再尝试编码或改编其他代码。