def scrap(driver, data): #Atualiza o soup com o novo html (contento todos os posts carregados) try: soup = BeautifulSoup(driver.page_source, 'html.parser') except: print('Erro ao conectar-se com a nova página.') return -1 # ---------- Scraping dos posts do Agile Alliance carregados posts = soup.select_one('ul.aa-search__results').find_all( 'li', 'wrap') #Pegando todos os posts print(len(posts)) for post in posts: #Recebemos o tipo tipo_post, _type = findType(post) #Recebemos o título titulo_post = post.select_one('span.aa-result-card__name-content') if titulo_post == None: titulo_post = '' else: titulo_post = titulo_post.text.strip() print(titulo_post) #Recebendo o href (faz uso do type, extraido em postType.py) try: href = post.select_one( f'a.aa-result-card.aa-result-card--{_type}').get('href') link_post = str(href) except AttributeError: link_post = '' try: autor_post = post.select_one('p.aa-result-card__meta').select_one( 'span') autor_post = autor_post.text.strip() except AttributeError: autor_post = '' #Recebendo data data_post = post.select_one('time.aa-result-card__created') if data_post == None: data_post = '' else: data_post = converterData(data_post.text) '''data_post = datetime.strptime(data_post.text, '%-m/%-d/%-y') data_post = data_post.strftime('%d/%m/%Y')''' #Recebendo a descrição descricao_post = post.select_one( 'span.aa-result-card__description-content') if descricao_post == None: descricao_post = '' else: descricao_post = descricao_post.text.strip() #Salvando no dicionario do dataframe data['tipo'].append(tipo_post) data['titulo'].append(titulo_post) data['link'].append(link_post) data['autor'].append(autor_post), data['data'].append(data_post) data['descricao'].append(descricao_post)
def scr_search_page(soup, lastPage, data, search_index): page_exist = True num_pag = 0 tipo_post = type_by_index(search_index) while page_exist: #posts_div_selector = 'view.view-content-search.view-id-content_search.view-display-id-article_search_page.resource-search.view-dom-id-fac100a8fa9502db56c377e7efd4aa19' if search_index != 4: try: #list_posts = soup.select_one('div', {'class': posts_div_selector }).select_one('div.view-content').find_all('div.views-row') first_post = [ soup.select_one('div.view-content').select_one('div') ] list_posts = first_post + soup.select_one( 'div.view-content').select_one('div').find_next_siblings( 'div') #print(len(list_posts)) except: print('- Nenhum resultado encontrado.') break else: try: #list_posts = soup.select_one('div', {'class': posts_div_selector }).select_one('div.view-content').find_all('div.views-row') first_post = [ soup.select_one('div.view-content').select_one( 'tbody').select_one('tr') ] list_posts = first_post + soup.select_one( 'div.view-content').select_one('tbody').select_one( 'tr').find_next_siblings('tr') #print(len(list_posts)) except: print('* Nenhum resultado encontrado.') break #Por poster encontrado na página: for post in list_posts: print('--- pag ---\n') #Recebendo o título if search_index != 4: titulo_post_tag = post.select_one('h3.title').select_one('a') if titulo_post_tag == None: titulo_post = '' else: titulo_post = titulo_post_tag.text.strip() #Recebendo autor try: autor_post = post.select_one( 'div.field.field-name-author.field-type-ds.field-label-hidden' ).select_one('a') except AttributeError: #Em presentations tem estrutura diferenciada autor_post = post.select_one( 'div.field.field-name-field-author.field-type-text.field-label-hidden' ).select_one('div.field-item.even') if autor_post == None: autor_post = '' else: autor_post = autor_post.text.strip() #Recebendo a descrição descricao_post = post.select_one( 'div.field.field-name-body.field-type-text-with-summary.field-label-hidden' ).select_one('p') if descricao_post == None: descricao_post = '' else: descricao_post = descricao_post.text.strip() else: #recebendo titulo e autor titulo_post_tag = post.select_one('h3').select_one('a') list_titulo_post_tag = titulo_post_tag.text.split('|') if len(list_titulo_post_tag) == 2: titulo_post, autor_post = list_titulo_post_tag else: titulo_post, autor_post = [ list_titulo_post_tag[0].strip(), ' ' ] #Recebendo descrição descricao_post = post.select_one('h3').next_sibling #print(descricao_post) #Recebendo o href do titulo -> tranformar no link completo href = titulo_post_tag.get('href') if href == None: link_post = '' else: link_post = str(href) if 'https://' not in link_post and 'http://' not in link_post: if 'https/' not in link_post: link_post = 'https://www.agileconnection.com' + link_post else: link_post.replace("https/", "https://") #Recebendo data data_post = post.select_one('div.field.field-name-post-date') if data_post == None: data_post = '' else: data_post = converterData(data_post.text.replace('-', '')) #Salvando no dicionario do dataframe data['tipo'].append(tipo_post) data['titulo'].append(titulo_post) data['link'].append(link_post) data['autor'].append(autor_post) data['data'].append(data_post) data['descricao'].append(descricao_post) #Checando se existe uma próxima página num_pag += 1 if num_pag >= lastPage: break try: pag = 'https://www.agileconnection.com' + soup.select_one( 'li.pager-next').find('a').get('href') except: page_exist = False print('Próxima página não encontrada.') break #Conectando com a próxima página try: html = requests.get(pag) soup = BeautifulSoup(html.text, 'html.parser') except: print(f'Erro 2 ao conectar-se com {pag}') break
def scr_page(soup, lastPage, selec, data, search_index): page_exist = True num_pag = 0 tipo_post = type_by_index(search_index) while page_exist: #Por poster encontrado na página: num_posts = 0 for post in soup.select_one('div', {'id': 'content'}).find_all('tr'): #Recebendo o título try: titulo_post_tag = post.select_one( selec['title']).select_one('a') print('PASSOU', titulo_post_tag.text.strip()) if search_index != 4: titulo_post = titulo_post_tag.text.strip() else: list_titulo_post_tag = titulo_post_tag.text.split('|') if len(list_titulo_post_tag) == 2: titulo_post, autor_post = list_titulo_post_tag else: titulo_post, autor_post = [ list_titulo_post_tag[0], ' ' ] except: break #Recebendo o href do titulo -> tranformar no link completo href = titulo_post_tag.get('href') if href == None: link_post = '' else: link_post = str(href) if 'http://' not in link_post and 'https://' not in link_post: if 'https/' not in link_post: link_post = 'https://www.agileconnection.com' + link_post else: link_post.replace("https/", "https://") #Recebendo autor if search_index != 4: autor_post = post.select_one(selec['autor']) try: autor_post = autor_post.select_one( 'a.username').text.strip() #Raise error???? if autor_post == None: raise Exception except: autor_post = autor_post.text.strip() if autor_post == None: autor_post = '' #Recebendo data data_post = post.select_one(selec['date']) if data_post == None: data_post = '' else: data_post = converterData(data_post.text) #Recebendo a descrição descricao_post = post.select_one(selec['teaser']).select_one('p') if descricao_post == None: descricao_post = '' else: descricao_post = descricao_post.text.strip() #Salvando no dicionario do dataframe data['tipo'].append(tipo_post) data['titulo'].append(titulo_post) data['link'].append(link_post) data['autor'].append(autor_post) data['data'].append(data_post) data['descricao'].append(descricao_post) num_posts += 1 if search_index != 4: if num_posts >= 10: break else: if num_posts >= len( soup.select_one('div', { 'id': 'content' }).find_all( 'tr')) - 14: #Sempre há 14 elementos do intrusos break #Checando se existe uma próxima página '''num_pag += 1 if num_pag >= lastPage: break''' try: pag = 'https://www.agileconnection.com' + soup.select_one( 'li.pager-next').find('a').get('href') except: page_exist = False print('Próxima página não encontrada.') break #Conectando com a próxima página try: html = requests.get(pag) soup = BeautifulSoup(html.text, 'html.parser') except: print(f'Erro ao conectar-se com {pag}') break
def scrum_scraper(): print("Iniciando execuação no Scrum ...") for page in range(0, 9999): break_next = False try: html = requests.get( 'https://www.scrum.org/resources?trainer_only_enable=0&page={}' .format(str(page))) soup = BeautifulSoup(html.text, 'html.parser') except: print('Erro ao conectar-se com o servidor') break #Conferindo se a página existe -> (no scrum n dá erro, ent precisa conferir): try: link_pag_atual = soup.find( 'li', 'pager__item is-active').find('a').get('href') if ('page=' + str(page)) not in str(link_pag_atual): break except: #Se não existir 'pager__item is-active', só executa essa vez break_next = True #Análise Scrum.org #Por poster encontrado na página: for poster in soup.select('.list-view-item'): #Recebemos o tipo tipo_poster = poster.select_one('.list-view-item-type') #Tratamento if tipo_poster == None: #Caso o tipo não exista tipo_poster = '' else: tipo_poster = tipo_poster.text.strip() #Recebemos o título titulo_poster_tag = poster.select_one('.list-view-item-title') if titulo_poster_tag == None: titulo_poster = '' else: titulo_poster = titulo_poster_tag.text.strip() #Se o titulo já existir na database, para aqui if titulo_poster in all_titles: break_next = True break #Recebendo o href do titulo -> tranformar no link completo href = titulo_poster_tag.get('href') if href == None: link_poster = '' else: link_poster = 'https://www.scrum.org' + str(href) #Recebendo data data_poster = poster.select_one('.list-view-item-date') if data_poster == None: data_poster = '' else: data_poster = converterData(data_poster.text) #Recebendo a descrição descricao_poster = poster.select_one('.list-view-item-teaser') if descricao_poster == None: descricao_poster = '' else: descricao_poster = descricao_poster.text.strip() #Salvando no dicionario do dataframe data['tipo'].append(tipo_poster) data['titulo'].append(titulo_poster) data['link'].append(link_poster) data['data'].append(data_poster) data['descricao'].append(descricao_poster) if break_next: break return data
'list-view-item-title') titulo_post = titulo_post_tag.text.strip() except: titulo_post = '' #recebendo link pelo tag titulo href = titulo_post_tag.get_attribute('href') if href == None: link_post = '' else: link_post = href #recebendo data try: data_post = post.find_element_by_class_name('list-view-item-date') data_post = converterData(data_post.text) except: data_post = '' #recebendo descrição / teaser try: descricao_post = post.find_element_by_class_name( 'list-view-item-teaser').text.strip() except: descricao_post = '' #Salvando no dicionario do dataframe data['tipo'].append(tipo_post) data['titulo'].append(titulo_post) data['link'].append(link_post) data['data'].append(data_post)
def scr_paper_page(soup, lastPage, data): page_exist = True while page_exist: #Por poster encontrado na página: num_posts = 0 for post in soup.select_one('div', {'id': 'content'}).find_all('tr'): #Recebendo o título try: titulo_post_tag = post.select_one( 'td.views-field.views-field-title').select_one('a') print('PASSOU', titulo_post_tag.text.strip()) titulo_post = titulo_post_tag.text.strip() except: break titulo_post, autor_post = titulo_post.split('|') print(titulo_post, autor_post) #Recebendo o href do titulo -> tranformar no link completo href = titulo_post_tag.get('href') if href == None: link_post = '' else: link_post = 'https://www.agileconnection.com' + str(href) #Recebendo autor #autor_post = post.select_one('div.field-name-user-row').select_one('a') if autor_post == None: autor_post = '' else: autor_post = autor_post.strip() #Recebendo data data_post = post.select_one('div.field-post-date') if data_post == None: data_post = '' else: data_post = converterData(data_post.text) #Recebendo a descrição descricao_post = post.select_one( 'td.views-field.views-field-title').select_one('p') if descricao_post == None: descricao_post = '' else: descricao_post = descricao_post.text.strip() tipo_poster = 'White Paper' #Salvando no dicionario do dataframe data['tipo'].append(tipo_poster) data['titulo'].append(titulo_post) data['link'].append(link_post) data['autor'].append(autor_post) data['data'].append(data_post) data['descricao'].append(descricao_post) num_posts += 1 if num_posts >= 10: break #Checando se existe uma próxima página '''num_pag += 1 if num_pag >= lastPage: break''' try: pag = 'https://www.agileconnection.com' + soup.select_one( 'li.pager-next').find('a').get('href') except: page_exist = False break #Conectando com a próxima página try: html = requests.get(pag) soup = BeautifulSoup(html.text, 'html.parser') except: print(f'Erro ao conectar-se com {pag}') break
def scrum_scraper(s_nome, s_tag, s_tipo, firstPg, lastPg): #intervalo de págs que deseja raspar firstPage = firstPg lastPage = lastPg #filtrar -> searchScrum(s_nome, s_tag, s_tipo) #Tratamento de parâmetros params = [] if isinstance(s_nome, str) and s_nome is not None: params.append(s_nome) if isinstance(s_tag, str) and s_tag is not None: params.append(s_tag) if isinstance(s_tipo, str) and s_tipo is not None: params.append(s_tipo) search = searchScrum( *params) #retorna parte da url formata pelos parâmetros break_next = False for page in range(firstPage, lastPage): try: html = requests.get( 'https://www.scrum.org/resources?{}trainer_only_enable=0&page={}' .format(search, str(page))) soup = BeautifulSoup(html.text, 'html.parser') except: print('Erro ao conectar-se com o servidor') break #Conferindo se a página existe -> (no scrum n dá erro, ent precisa conferir): try: link_pag_atual = soup.find( 'li', 'pager__item is-active').find('a').get('href') print('page=' + str(page)) if ('page=' + str(page)) not in str(link_pag_atual): break except: #Se não existir 'pager__item is-active', só executa essa vez break_next = True #Análise Scrum.org #Por poster encontrado na página: for poster in soup.select('.list-view-item'): #Recebemos o tipo tipo_poster = poster.select_one('.list-view-item-type') #Tratamento if tipo_poster == None: #Caso o tipo não exista tipo_poster = '' else: tipo_poster = tipo_poster.text.strip() #Recebemos o título titulo_poster_tag = poster.select_one('.list-view-item-title') if titulo_poster_tag == None: titulo_poster = '' else: titulo_poster = titulo_poster_tag.text.strip() #Recebendo o href do titulo -> tranformar no link completo href = titulo_poster_tag.get('href') if href == None: link_poster = '' else: link_poster = 'https://www.scrum.org' + str(href) #Recebendo data data_poster = poster.select_one('.list-view-item-date') if data_poster == None: data_poster = '' else: data_poster = converterData(data_poster.text) """if data_filtro == False: #Se n estiver de acordo com o intervalo de tempo, pula esse resultado continue""" #Recebendo a descrição descricao_poster = poster.select_one('.list-view-item-teaser') if descricao_poster == None: descricao_poster = '' else: descricao_poster = descricao_poster.text.strip() #Salvando no dicionario do dataframe data['tipo'].append(tipo_poster) data['titulo'].append(titulo_poster) data['link'].append(link_poster) data['data'].append(data_poster) data['descricao'].append(descricao_poster) if break_next: break '''if len(data['titulo']) > 0: #se algum resultado for capturado # ---- Salvando resultado df = pd.DataFrame(data, columns = ['tipo', 'titulo', 'link', 'data', 'descricao']) #-> criando dataframe # ---- Exportando para excel(xlsx) e/ou csv excel_file, csv_file = exportar_df(df, 'xlsx', 'csv', wb='S')''' print('FIM DA EXECUÇÃO') return data
else: titulo_poster = titulo_poster_tag.text.strip() #Recebendo o href do titulo -> tranformar no link completo href = titulo_poster_tag.get('href') if href == None: link_poster = '' else: link_poster = 'scrum.org' + str(href) #Recebendo data data_poster = poster.select_one('.list-view-item-date') if data_poster == None: data_poster = '' else: data_poster = converterData(data_poster.text) #Recebendo a descrição descricao_poster = poster.select_one('.list-view-item-teaser') if descricao_poster == None: descricao_poster = '' else: descricao_poster = descricao_poster.text.strip() #Salvando no dicionario do dataframe data['tipo'].append(tipo_poster) data['titulo'].append(titulo_poster) data['link'].append(link_poster) data['data'].append(data_poster) data['descricao'].append(descricao_poster)