Вам не обязательно нужен селен. Вы можете использовать запросы, конечно, для большого набора результатов. Страница извлекает данные через сервер, который выполняет SQL-запрос, у которого есть параметр количества записей, который можно настроить для нужного количества результатов, nbr_ref_pge
. Вы можете написать запрос POST, который передает необходимую информацию, которая затем передается в запрос SQL. Теперь вы можете рассчитать, как это может выглядеть в пакетах, чтобы получить общее количество, которое вам нужно, и посмотреть, есть ли смещение, чтобы учесть это.
У меня недостаточно опыта с asyncio
, но я подозреваю, что это был бы хороший способ, так как количество запросов велико для отдельных страниц сайта. Моя попытка только с сеансом - шоу. Я взял синтаксис повторов из ответа @datashaman
import requests
import pandas as pd
from bs4 import BeautifulSoup as bs
from requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
baseUrl = 'https://www.whed.net/'
searchTerm = 'Business Administration'
headers = {'Accept': 'application/json'}
params = {'Chp2' : searchTerm}
url = 'https://www.whed.net/results_institutions.php'
data = {
'where': "(FOS LIKE '%|" + searchTerm + "|%')",
'requete' : '(Fields of study=' + searchTerm + ')',
'ret' : 'home.php',
'afftri' : 'yes',
'stat' : 'Fields of study',
'sort' : 'InstNameEnglish,iBranchName',
'nbr_ref_pge' : '1000'
}
results = []
with requests.Session() as s:
retries = Retry(total=5,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s.mount('http://', HTTPAdapter(max_retries=retries))
res = s.post(url, params = params, headers = headers, data = data)
soup = bs(res.content, 'lxml')
links = set([baseUrl + item['href'] for item in soup.select("[href*='detail_institution.php?']")])
for link in links:
res = s.get(link)
soup = bs(res.content, 'lxml')
items = soup.select('#contenu span')
name = soup.select_one('#contenu h2').text.strip()
country = soup.select_one('.country').text.strip()
i = 0
for item in items:
if 'Tel.' in item.text:
phone = items[i+1].text
if 'WWW:' in item.text:
website = items[i+1].text
i+=1
results.append([name, country, phone, website])
name = country = phone = website = ''
df = pd.DataFrame(results)
Вы должны использовать call
в вашем пакетном скрипте, или завершение vcvars32.bat
прекратит ваш собственный пакетный скрипт. Поэтому ваш скрипт должен быть:
@echo off
call "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
vcbuild
Вы также захотите проверить, что скрипт еще не запущен или у вас начнется нехватка памяти если вы снова и снова вызываете свой скрипт в одной и той же консоли.
IF '%VSINSTALLDIR%' NOT EQU '' THEN EXIT 0