Неполадки при получении результатов со следующих страниц с помощью почтовых запросов - PullRequest
0 голосов
/ 25 ноября 2018

Я написал скрипт на python для заполнения табличных данных при заполнении двух полей ввода (From и Through), расположенных в правом верхнем углу веб-страницы.Дата, которую я заполнил для получения результатов: 08/28/2017 и 11/25/2018.

Когда я запускаю следующий скрипт, я могу получить табличные результаты с его первой страницы.

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

URL-адрес сайта

Это моя попытка:

import requests
from bs4 import BeautifulSoup

url = "https://www.myfloridalicense.com/FLABTBeerPricePosting/"

res = requests.get(url)
soup = BeautifulSoup(res.text,"lxml")
try:
  evtrgt = soup.select_one("#__EVENTTARGET").get('value')
except AttributeError: evtrgt  = ""
viewstate = soup.select_one("#__VIEWSTATE").get('value')
viewgen = soup.select_one("#__VIEWSTATEGENERATOR").get('value')
eventval = soup.select_one("#__EVENTVALIDATION").get('value')

payload = {
  '__EVENTTARGET': evtrgt,
  '__EVENTARGUMENT': '',
  '__VIEWSTATE':viewstate, 
  '__VIEWSTATEGENERATOR':viewgen,
  '__VIEWSTATEENCRYPTED':'',
  '__EVENTVALIDATION':eventval,
  'ctl00$MainContent$txtPermitNo':'', 
  'ctl00$MainContent$txtPermitName': '',
  'ctl00$MainContent$txtBrandName':'', 
  'ctl00$MainContent$txtPeriodBeginDt':'08/28/2017',
  'ctl00$MainContent$txtPeriodEndingDt':'11/25/2018',
  'ctl00$MainContent$btnSearch': 'Search'
}

with requests.Session() as s:
  s.headers["User-Agent"] = "Mozilla/5.0"
  req = s.post(url,data=payload,cookies=res.cookies.get_dict())
  sauce = BeautifulSoup(req.text,"lxml")
  for items in sauce.select("#MainContent_gvBRCSummary tr"):
    data = [item.get_text(strip=True) for item in items.select("th,td")]
    print(data)

Любая помощь для решения проблемы будет принята с благодарностью.Еще раз: данные, которые я хочу получить, представляют собой табличные данные со следующих страниц сайта, поскольку мой сценарий уже может анализировать данные с его первой страницы?

P.S.: Browser simulator is not an option I would like to cope with.

1 Ответ

0 голосов
/ 29 ноября 2018

Вам необходимо добавить цикл для каждой страницы и назначить запрошенный номер страницы параметру __EVENTARGUMENT следующим образом:

import requests
from bs4 import BeautifulSoup

url = "https://www.myfloridalicense.com/FLABTBeerPricePosting/"

res = requests.get(url)
soup = BeautifulSoup(res.text,"lxml")

try:
    evtrgt = soup.select_one("#__EVENTTARGET").get('value')
except AttributeError: 
    evtrgt = ""

viewstate = soup.select_one("#__VIEWSTATE").get('value')
viewgen = soup.select_one("#__VIEWSTATEGENERATOR").get('value')
eventval = soup.select_one("#__EVENTVALIDATION").get('value')

payload = {
    '__EVENTTARGET' : evtrgt,
    '__EVENTARGUMENT' : '',
    '__VIEWSTATE' : viewstate, 
    '__VIEWSTATEGENERATOR' : viewgen,
    '__VIEWSTATEENCRYPTED' : '',
    '__EVENTVALIDATION' : eventval,
    'ctl00$MainContent$txtPermitNo' : '', 
    'ctl00$MainContent$txtPermitName' : '',
    'ctl00$MainContent$txtBrandName' : '', 
    'ctl00$MainContent$txtPeriodBeginDt' : '08/28/2017',
    'ctl00$MainContent$txtPeriodEndingDt' : '11/25/2018',
    'ctl00$MainContent$btnSearch': 'Search'
}

for page in range(1, 12):
    with requests.Session() as s:
        s.headers["User-Agent"] = "Mozilla/5.0"
        payload['__EVENTARGUMENT'] = f'Page${page}'
        req = s.post(url,data=payload,cookies=res.cookies.get_dict())
        sauce = BeautifulSoup(req.text, "lxml")

        for items in sauce.select("#MainContent_gvBRCSummary tr"):
            data = [item.get_text(strip=True) for item in items.select("th,td")]
            print(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...