Python Web Scrapping с поиском и нединамическим URI - PullRequest
0 голосов
/ 24 января 2019

Я новичок в мире python и web-scrappers, я привык делать скребки с динамическими URL, где URI меняются, когда я вводю конкретные параметры в сам URL.
Пример: Википедия.
(Если я введу поиск с именем «Переполнение стека», у меня будет URI, который выглядит следующим образом: https://en.wikipedia.org/wiki/Stack_Overflow)

На данный момент мне предложили разработать веб-скребок для сбора данных с этой страницы .

Поле "Texto / Termos a serem pesquisados" соответствует полю поиска, но когда я ввожу поиск, URL остается прежним, что не позволяет мне получить правильный HTML-код для моего исследования.

Я привык работать с BeautifulSoup и Requests, чтобы выполнить утилизацию, но в этом случае это бесполезно, так как URL остается неизменным после поиска.

import requests
from bs4 import BeautifulSoup

url = 'http://comprasnet.gov.br/acesso.asp?url=/ConsultaLicitacoes/ConsLicitacao_texto.asp'
html = requests.get(url)
bs0bj = BeautifulSoup(html.content,'html.parser')

print(bsObj)
# And from now on i cant go any further  

Обычно я делал бы что-то вроде

url = 'https://en.wikipedia.org/wiki/'
input = input('Input your search :)
search = url + input

А затем сделайте все, что нужно в BeautifulSoup, и найдите все, чтобы получить мои данные из кода HTML.

Я тоже пытался использовать Selenium, но я ищу что-то отличное от всего, что связано с веб-драйверами. Со следующим фрагментом кода я достиг некоторых странных результатов, но я все еще не могу хорошо обработать HTML.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import requests
from bs4 import BeautifulSoup

# Acess the page and input the search on the field

driver = webdriver.Chrome()
driver.get('http://comprasnet.gov.br/acesso.asp?url=/ConsultaLicitacoes/ConsLicitacao_texto.asp')
driver.switch_to.frame('main2')
busca = driver.find_element_by_id("txtTermo")
busca.send_keys("GESTAO DE PESSOAS")
#data_inicio = driver.find_element_by_id('dt_publ_ini')
#data_inicio.send_keys("01/01/2018")
#data_fim = driver.find_element_by_id('dt_publ_fim')
#data_fim.send_keys('20/12/2018')
botao = driver.find_element_by_id('ok')
botao.click()

Итак, учитывая все это:
* Есть ли способ удалить данные из этих статических URL?
* Могу ли я ввести поиск в поле с помощью кода?
* Почему я не могу почистить правильный исходный код?

1 Ответ

0 голосов
/ 24 января 2019

Проблема в том, что ваша начальная страница поиска использует фреймы для поиска и результатов, что затрудняет BeautifulSoup работу с ней. Я смог получить результаты поиска, используя немного другой URL-адрес и вместо MechanicalSoup:

>>> from mechanicalsoup import StatefulBrowser
>>> sb = StatefulBrowser()
>>> sb.open('http://comprasnet.gov.br/ConsultaLicitacoes/ConsLicitacao_texto.asp')
<Response [200]>
>>> sb.select_form()  # select the search form
<mechanicalsoup.form.Form object at 0x7f2c10b1bc18>
>>> sb['txtTermo'] = 'search text'  # input the text to search for
>>> sb.submit_selected()  # submit the form
<Response [200]>
>>> page = sb.get_current_page()  # get the returned page in BeautifulSoup form
>>> type(page)
<class 'bs4.BeautifulSoup'>

Обратите внимание, что URL-адрес, который я здесь использую, относится к фрейму, в котором есть форма поиска, а не к той странице, которую вы указали. Это удаляет один слой косвенности.

MechanicalSoup построен поверх BeautifulSoup и предоставляет некоторые инструменты для взаимодействия с веб-сайтами аналогично старой библиотеке mechanize.

...