Как я могу очистить результаты поиска после входа на веб-сайт с использованием Python и beautifulsoup4?

#python #python-3.x #web-scraping #beautifulsoup #python-requests

#python #python-3.x #очистка веб-страниц #beautifulsoup #python-запросы

Вопрос:

Я хочу войти на веб-сайт, выполнить поиск на странице, а затем очистить все результаты.

Мне каким-то образом удалось войти в систему с использованием Python и запросов, но когда я выполняю запрос get на странице, на которой я хочу выполнить поиск, или всякий раз, когда я выполняю запрос post на этой странице со всеми критериями поиска, переданными в теле, я на самом деле не получаю никакого результата поиска. Вместо этого в заголовке по-прежнему написано «Login to page», что является заголовком страницы входа в систему, поэтому почему-то кажется, что я не могу выполнить какую-либо операцию REST после входа в систему. Есть ли какой-либо конкретный способ очистить веб-сайт, когда требуется войти в систему, а затем выполнить поиск?

Ниже приведена моя попытка:

 import requests
from lxml import html
from bs4 import BeautifulSoup

USERNAME = "abcdefgh"
PASSWORD = "xxxxxxx"

LOGIN_URL = "https://www.assortis.com/en/login.asp"
URL = "https://www.assortis.com/en/members/bsc_search.asp?act=sc"
SEARCH_URL = "https://www.assortis.com/en/members/bsc_results.asp"


def scrapeIt():
    session_requests = requests.session()
    
    #login
    result = session_requests.get(LOGIN_URL)
    tree = html.fromstring(result.text)
    # print(tree)
        
    # Create payload
    payload = {
        "login_name": USERNAME,
        "login_pwd": PASSWORD,
        "login_btn": "Login"
    }

    search_payload = {
        'mmb_cou_hid': '0,0',
        'mmb_don_hid': '0,0',
        'mmb_sct_hid': '0,0',
        'act': 'contract',
        'srch_sdate': '2016-01-01',
        'srch_edate': '2018-12-31',
        'procurement_type': 'Services',
        'srch_budgettype': 'any',
        'srch_budget': '',
        'srch_query': '',
        'srch_querytype': 'all of the words from'
    }
    # Perform login
    result = session_requests.post(LOGIN_URL, data=payload, headers=dict(referer=LOGIN_URL))

    # Scrape url
    result = session_requests.get(URL, headers=dict(referer=URL))
    result = session_requests.post(SEARCH_URL, data=search_payload, headers=dict(referer=SEARCH_URL))
    content = result.content
    # print(content)
    data = result.text
    soup = BeautifulSoup(data, 'html.parser')

    print(soup)


scrapeIt()
  

РЕДАКТИРОВАТЬ: веб-страница, возможно, написана на JavaScript.

Комментарии:

1. страница может использовать JavaScript, но request / beautifulsoup / lxml не запускает JavaScript. вы можете открыть веб-браузер, отключить JavaScript и войти на свою страницу, чтобы посмотреть, что может получить скрипт.

2. вы проверяли страницу, которую получаете после входа в скрипт? Я думаю, вы не входили в систему. Я открыл страницу входа и проверил запрос в DevTool в Chrome / Firefox, и я вижу, что он отправляет логин и пароль как login_name и login_pwd , не username / password

3. @furas извините, это была опечатка, я пробовал с login_name и login_pwd … не работает. Также как отключить java script и просмотреть веб-страницу?

4. он также отправляет запрос POST на "https://www.assortis.com/login.asp" — без /en/ указания URL.

5. итак, эта страница не может работать без JavaScript. Итак, вы должны использовать Selenium

Ответ №1:

Сохраните свой response.text в локальный файл после входа в систему, чтобы увидеть, действительно ли вы вошли в систему, проверьте файл, в противном случае вместо обратного проектирования http-запросов попробуйте Selenium chromedriver.

Часть регистрации проще в Selenium, но поиск содержимого на странице — нет, используйте ожидание исключений для динамической загрузки, driver.page_source, чтобы увидеть html, иногда браузер пишет html по-другому, т.Е. <tbody> теги