Мой вопрос: возможно ли что-то подобное?
blockquote>Да.
Если да, то как?
blockquote>В приведенном ниже коде многое происходит. Но главное - выяснить, какие запросы отправляются браузером, а затем эмулировать их с помощью запросов. Мы можем узнать запрос, сделанный через вкладку «сеть» в инструменте проверки.
Сначала мы создаем запрос поиска. Это дает левую и правую таблицу. Щелчок по левому столу дает нам школы в этом районе. Но если мы внимательно наблюдаем, щелчок по ссылке на область также является почтовым запросом (который мы должны сделать, используя запросы)
Например. Нажав на «ВВС - Восточная болезнь». дает нам таблицу, содержащую ссылки школ в этой области. Затем мы должны перейти к этой школьной ссылке и выяснить потенциал.
Так как нажатие на каждую ссылку школы также является запросом поста, мы должны подражать, и это возвращает страницу школы. Отсюда мы отбрасываем название школы и вместимость.
Вы можете прочитать Расширенное использование запросов , чтобы узнать об объектах Session, Выполнить запрос , чтобы прочитать о создании запроса с помощью запросов.
import requests from bs4 import BeautifulSoup import pandas as pd end_list=[] s = requests.Session() URL = "http://web1.ncaa.org/stats/StatsSrv/careersearch" data={'doWhat': 'teamSearch','searchOrg': 'X', 'academicYear': 2006, 'searchSport':'MFB','searchDiv': 1} r = s.post(URL,data=data) soup=BeautifulSoup(r.text,'html.parser') area_list=soup.find_all('table')[8].find_all('tr') area_count=len(area_list)#has no of areas + 1 tr 'Total Results of Search: 239' for idx in range(0,area_count): data={ 'sortOn': 0, 'doWhat': 'showIdx', 'playerId':'' ,'coachId': '', 'orgId':'' , 'academicYear':'' , 'division':'' , 'sportCode':'' , 'idx': idx } r = s.post(URL,data=data) soup=BeautifulSoup(r.text,'html.parser') last_table=soup.find_all('table')[-1]#last table for tr in last_table.find_all('tr'): link_td=tr.find('td',class_="text") try: link_a=link_td.find('a')['href'] data_params=link_a.split('(')[1][:-2].split(',') try: #print(data_params) sports_code=data_params[2].replace("'","").strip() division=int(data_params[3]) player_coach_id=int(data_params[0]) academic_year=int(data_params[1]) org_id=int(data_params[4]) #print(sports_code,division,player_coach_id,academic_year,org_id) data={ 'sortOn': 0, 'doWhat': 'display', 'playerId': player_coach_id, 'coachId': player_coach_id, 'orgId': org_id, 'academicYear': academic_year, 'division':division, 'sportCode':sports_code, 'idx':'' } url='http://web1.ncaa.org/stats/StatsSrv/careerteam' r = s.post(url,data=data) soup2=BeautifulSoup(r.text,'html.parser') institution_name=soup2.find_all('table')[1].find_all('tr')[2].find_all('td')[1].text.strip() capacity=soup2.find_all('table')[4].find_all('tr')[2].find_all('td')[1].text.strip() #print([institution_name, capacity]) end_list.append([institution_name, capacity]) except IndexError: pass except AttributeError: pass #print(end_list) headers=['School','Capacity'] df=pd.DataFrame(end_list, columns=headers) print(df)
Выход
School Capacity 0 Air Force 46,692 1 Akron 30,000 2 Alabama 101,821 3 Alabama A&M; 21,000 4 Alabama St. 26,500 5 Albany (NY) 8,500 6 Alcorn 22,500 7 Appalachian St. 30,000 8 Arizona 55,675 9 Arizona St. 64,248 10 Ark.-Pine Bluff 14,500 11 Arkansas 72,000 12 Arkansas St. 30,708 13 Army West Point 38,000 14 Auburn 87,451 15 Austin Peay 10,000 16 BYU 63,470 17 Ball St. 22,500 18 Baylor 45,140 19 Bethune-Cookman 9,601 20 Boise St. 36,387 21 Boston College 44,500 22 Bowling Green 24,000 23 Brown 20,000 24 Bucknell 13,100 25 Buffalo 29,013 26 Butler 5,647 27 Cal Poly 11,075 28 California 62,467 29 Central Conn. St. 5,500 .. ... ... 209 UCLA 91,136 210 UConn 40,000 211 UNI 16,324 212 UNLV 36,800 213 UT Martin 7,500 214 UTEP 52,000 215 Utah 45,807 216 Utah St. 25,100 217 VMI 10,000 218 Valparaiso 5,000 219 Vanderbilt 40,350 220 Villanova 12,000 221 Virginia 61,500 222 Virginia Tech 65,632 223 Wagner 3,300 224 Wake Forest 31,500 225 Washington 70,138 226 Washington St. 32,740 227 Weber St. 17,500 228 West Virginia 60,000 229 Western Caro. 13,742 230 Western Ill. 16,368 231 Western Ky. 22,113 232 Western Mich. 30,200 233 William & Mary 12,400 234 Wisconsin 80,321 235 Wofford 13,000 236 Wyoming 29,181 237 Yale 64,269 238 Youngstown St. 20,630 [239 rows x 2 columns]
Примечание. Это займет много времени. Утилизируем> 239 страниц. Так что наберитесь терпения. Может занять 15 минут или дольше.
Установка функций как это может быть хитрой, особенно если драйвер не следует инструкциям по печати Microsoft. Однако мы имели некоторый успех с Системой. Рисование. Печать. PrinterSettings. Можно установить PaperSource, но я не уверен, что можно установить значения по умолчанию.
Если Вы не видели этот пример, можно хотеть далее посмотреть на него. Это описывает метод, чтобы сохранить и перезагрузить параметры принтера. Один из моих парней указал на него на меня: PrinterSettings - Изменение, Хранение и Загрузка Параметров принтера
Другой метод, который мог работать, но не мог бы работать на Вас, должен определить Ваш небольшое количество установок, в которых Вы нуждаетесь. Установите принтер с каждым из них (т.е.: Лоток 1, Лоток 2) установки. Затем просто переключите принтер по умолчанию на печати. Не, что Вы ищете, но это может помочь.
То, что мы обычно делаем в этих ситуациях, имеют приложение сторонних производителей, пишут данные в папку, которую мы контролируем, мы затем берем файл и анализируем Постскриптум или PCL сами и изменяем лоток для бумаги и затем отправляем на устройство назначения. Намного более простой затем это может звучать.
dmDefaultSource управляет лотком. К сожалению, значения, к которым Вы захотите установить это, отличаются в зависимости от Вашего драйвера, поскольку это - число мусорного ведра и не обязательно то же число как tray#, распечатанный на Вашем принтере.
Следующая ссылка предоставляет некоторый код VB6 для сбора информации о Ваших присвоениях лотка/мусорного ведра принтеров. Можно использовать ту информацию, чтобы программно присвоить dmDefaultSource соответствующему мусорному ведру # для лотка. В основном необходимо использовать DeviceCapabilities, чтобы возвратить информацию о принтерах и затем искать строку (как "Лоток 1") для получения связанного числа мусорного ведра.
Я должен был недавно сделать что-то очень похожее на определенном драйвере принтера, и оно потребовало поставщику определенного SDK. Лоток, кажется, не появляется в DEVMODE или любой из других структур PRINTINFO_*, таким образом, я предполагаю, что отбросил бы электронное письмо поставщику принтера.
Как последнее прибежище я могу думать о двух возможных взломах. Нужно автоматизировать драйвер на уровне GUI с помощью инструмента в виде сценария, такого как AutoIT. Второй должен вывести реестр в файл, изменить настройки драйвера, вывести реестр снова и выдержать сравнение, различия (можете, или может не работать).
Насколько я знаю, принтерами управляет драйвер принтера путем отправки им команд PJL или SNMP. Но не все принтеры реализуют полностью эти наборы команд.
Для принтеров HP я нашел в: http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=en&cc=us&objectID=bpl07282&jumpid=reg_R1002_USEN некоторые команды PJL (существуют некоторые связанные с лотком также).
Я не уверен эта справка, но беру ее в качестве подсказки для будущих поисков...