Boa noite,
Estou tentando fazer raspagem de dados com o seguinte código:
import requests as rq
import json
import pandas as pd
from bs4 import BeautifulSoup as bs
url='http://web.archive.org/cdx/search/cdx?url=economia.uol.com.br&collapse=digest&from=20201001&to=20201002&output=json'
urls=rq.get(url).text
parse_url=json.loads(urls) # formatando as informações em um formato do tipo json
parse_url[1][1]
waylink=parse_url[1][1]+'/'+ parse_url[1][2]
url_final='https://web.archive.org/web/'+waylink
url_list=[]
final_url_list=[]
for i in range(1,len(parse_url)):
tstamp=parse_url[i][1]
orig_url=parse_url[i][2]
waylink=tstamp+'/'+orig_url
url_list.append(waylink)
for url in url_list:
final_url_list.append('https://web.archive.org/web/'+url)
lista_de_urls_finais[0]
req=rq.get(final_url_list[0]).text
soup=bs(req,'html.parser')
soup.find_all('h2', 'thumb-title')
soup.find_all('h2', 'thumb-title')[0].get_text()
soup.find_all('div',attrs='thumbnail-standard-wrapper')[0].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'})
for link in soup.find_all('div',attrs='thumbnail-standard-wrapper')[0].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}):
print (link.get('href'))
n_noticias=len(soup.find_all('div',attrs='thumbnail-standard-wrapper'))
lista_links=[]
for noticia in range(n_noticias):
for link in soup.find_all('div',attrs='thumbnail-standard-wrapper')[noticia].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}):
lista_links.append(link.get('href'))
noticia={}
noticias=[]
for n in range(n_noticias):
noticia['título']=soup.find_all('h2', 'thumb-title')[n].get_text()
noticia['link']=lista_links[n]
noticias.append(noticia)
noticia={}
url='https://web.archive.org/web/20201002163105/https://economia.uol.com.br/empregos-e-carreiras/noticias/redacao/2020/09/30/pnad-continua-ibge-desemprego.htm'
req=rq.get(url).text
soup=bs(req,'html.parser')
soup.find('div', attrs={'class':'text has-image '}).get_text()
def captura_noticia(url):
req=rq.get(url).text
soup=bs(req,'html.parser')
texto_noticia=soup.find('div', attrs={'text has-image '})
if texto_noticia==None:
texto_noticia='Página não capturada'
elif texto_noticia!=None:
texto_noticia=soup.find('div', attrs={'text has-image '}).get_text()
return texto_noticia
noticia={}
noticias=[]
lista_links=[]
for url in final_url_list:
req=rq.get(url).text
soup=bs(req,'html.parser')
n_noticias=len(soup.find_all('div',attrs='thumbnail-standard-wrapper'))
for n in range(n_noticias):
for link in soup.find_all('div',attrs='thumbnail-standard-wrapper')[n].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}):
lista_links.append(link.get('href'))
for n in range(n_noticias):
noticia['titulo']=soup.find_all('h2', attrs='thumb-title')[n].get_text()
noticia['link']=lista_links[n]
noticia['texto_noticia']=captura_noticia(lista_links[n])
noticias.append(noticia)
noticia={}
lista_links=[]
noticias
tabela=pd.DataFrame(data=noticias)
tabela.to_excel("Tabela de Noticias Teste.xls")
O script faz a extração, mas alguns sites ele não consegue extrair. Fui abrindo e inspecionando alguns sites que ele não conseguiu abrir e vi que a class relacionada ao texto da notícia não é 'text has-image ', mas 'c-news__body' ou 'text '.
Exemplos:
https://economia.uol.com.br/noticias/redacao/2020/09/30/bolsa-fecha-em-alta.htm https://www1.folha.uol.com.br/mercado/2020/09/nova-cpmf-de-guedes-trava-e-congresso-deve-derrubar-desoneracao-da-folha.shtml
Desse modo, eu tentei alterar o código, para modificar esses parâmetros, desse modo:
url='https://web.archive.org/web/20201002163105/https://economia.uol.com.br/empregos-e-carreiras/noticias/redacao/2020/09/30/pnad-continua-ibge-desemprego.htm'
req=rq.get(url).text
soup=bs(req,'html.parser')
soup.find('div', attrs={'class':'c-news__body'}).get_text()
def captura_noticia(url):
req=rq.get(url).text
soup=bs(req,'html.parser')
texto_noticia=soup.find('div', attrs={'c-news__body'})
if texto_noticia==None:
texto_noticia='Página não capturada'
elif texto_noticia!=None:
texto_noticia=soup.find('div', attrs={'c-news__body'}).get_text()
return texto_noticia
obs: fiz a mesma coisa alterando para 'text '.
Porém, nos dois casos dá o mesmo erro: 'NoneType' object has no attribute 'get_text'
Alguém pode me ajudar por favor?
Muito obrigada