Распараллелить парсинг веб-страниц с помощью Python и Selenium [Отредактировано и обновлено]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Распараллелить парсинг веб-страниц с помощью Python и Selenium [Отредактировано и обновлено]

Сообщение Anonymous »

Я пытаюсь получить данные о здоровье из хранилища данных о здравоохранении Бразилии. Я пытаюсь получить количество посещений врача по поводу тревоги/депрессии за каждый месяц за период с 2018 по 2024 год, для каждого пола (М/Ж) и для 22 различных возрастных групп. У меня есть список кодов A/D (54), и я хочу узнать, сколько посещений было у каждого кода отдельно. У меня есть кадр данных, в котором каждая строка представляет собой одну комбинацию этих переменных (54 кода X 2 пола X 22 возрастных группы X 7 лет):

Код: Выделить всё

combns = pd.read_csv("/.../data/Anxiety_Depression_combinations.csv")

code    year    sex codeType    agelower    ageupper
0   F32 2018    2   CID 0   200
1   F320    2018    2   CID 0   200
2   F321    2018    2   CID 0   200
3   F322    2018    2   CID 0   200
4   F323    2018    2   CID 0   200
... ... ... ... ... ... ...
16627   P01 2024    3   CIAP    100 200
16628   P02 2024    3   CIAP    100 200
16629   P74 2024    3   CIAP    100 200
16630   P79 2024    3   CIAP    100 200
16631   P82 2024    3   CIAP    100 200
16632 rows × 6 columns
Для каждой строки в кадре данных я меняю настройки, затем очищаю полученную таблицу HTML и сохраняю ее как файл Excel. У меня есть этот код, чтобы открыть веб-браузер в автономном режиме и выбрать некоторые общие настройки:

Код: Выделить всё

url = "https://sisab.saude.gov.br/paginas/acessoRestrito/relatorio/federal/saude/RelSauProducao.xhtml"
DRIVER_PATH = '/home/kvemuri/.local/share/binman_chromedriver/linux64/128.0.6613.119/chromedriver'
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
driver = webdriver.Chrome(executable_path=DRIVER_PATH,options=options)
#driver.quit()

# Open browser and navigate to SISAB website.
#DRIVER_PATH = '/home/kvemuri/.local/share/binman_chromedriver/linux64/127.0.6533.119/chromedriver'
#driver = webdriver.Chrome(executable_path=DRIVER_PATH)
#url = "https://sisab.saude.gov.br/paginas/acessoRestrito/relatorio/federal/saude/RelSauProducao.xhtml"
driver.get(url)
# Set type of service - Individual
driver.find_element(By.ID,"tpProducao").send_keys('Atendimento Individual')

# Set column to month (Competencia)
driver.find_element(By.XPATH,'//*[@id="selectLinha"]/optgroup[1]/option[6]').click()

# Set Type of team
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]/ul/li[2]/a/label/input').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]/ul/li[5]/a/label/input').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]/ul/li[9]/a/label/input').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]').click()

# Set place of service
driver.find_element(By.XPATH,'//*[@id="filtrosLocalTipoEstabelecimento"]/div/button').click()
driver.find_element(By.XPATH,'//*[@id="filtrosLocalTipoEstabelecimento"]/div/ul/li[2]/a/label/input').click()
driver.find_element(By.XPATH,'//*[@id="filtrosLocalTipoEstabelecimento"]/div/button').click()

# Set type of service - Individual
driver.find_element(By.ID,"tpProducao").send_keys('Atendimento Individual')

# Set type of attendance - select all
driver.find_element(By.XPATH,'//*[@id="divTipoAtendimento"]/div/button/span').click()
driver.find_element(By.XPATH,'//*[@id="divTipoAtendimento"]/div/ul/li[1]/a/label').click()
driver.find_element(By.XPATH,'//*[@id="divTipoAtendimento"]/div/button/span').click()

# Set type of professional
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/button/span').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/ul/li[12]/a/label').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/ul/li[19]/a/label').click()
driver.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/button/span').click()

# Select 'years' button for age
driver.find_element(By.XPATH,'//*[@id="tpIdade:2"]').click()
У меня есть следующие функции:

Код: Выделить всё

def createXpathPattern(code,codeType):
if codeType == 'CID':
codeXpath = '//*[@id="cid-{}-1"]'.format(code)
#code = code
else:
codeXpath = '//*[@id="cid-{}-4"]'.format(code)

def setDxCode(code, codeType):
if codeType == 'CID':
codeXpath = '//*[@id="cid-{}-1"]'.format(code)
#code = code
else:
codeXpath = '//*[@id="cid-{}-4"]'.format(code)
#codeXpath = '//*[@id="cid-{}"]'.format(code)
#codeXpath = createXpathPattern(code = code, codeType = codeType)
driver.find_element(By.ID,"btnAddCid").click()
time.sleep(1)
searchBox = driver.find_element(By.XPATH,'//*[@id="dtBasicExample_filter"]/label/input')
searchBox.clear()
searchBox.send_keys(code)
#time.sleep(1)
driver.find_element(By.XPATH,codeXpath).click()
searchBox.clear()
#time.sleep(1)
driver.find_element(By.XPATH,'//*[@id="modal-default-cid"]/div/div/div[2]/button[2]/span').click()

# function to set age group and sex

def setAgeLimit(agelower, ageupper):

"""Selects the upper and lower age limit in years,  and the sex for which data is to be output"""

#Set lower age limit
agelim1 = driver.find_element(By.XPATH,'//*[@id="idadeInicio"]')
agelim1.clear()
agelim1.send_keys(str(agelower))

#Set uper age limit
agelim2 = driver.find_element(By.XPATH,'//*[@id="idadeFim"]')
agelim2.clear()
agelim2.send_keys(str(ageupper))

def setSex(sex = 1):
# Set Sex
sexXpath = '//*[@id="filtrosCaracteristicaUsuario"]/div/ul/li[{}]/a/label'.format(sex)
driver.find_element(By.XPATH,'//*[@id="filtrosCaracteristicaUsuario"]/div/button/span').click() #//*[@id="filtrosCaracteristicaUsuario"]/div/button
driver.find_element(By.XPATH,sexXpath).click() # //*[@id="filtrosCaracteristicaUsuario"]/div/ul/li[2]/a/label/input
driver.find_element(By.XPATH,'//*[@id="filtrosCaracteristicaUsuario"]/div/button/span').click()

# Get list of all months in the months column in the webpage
monthBoxes = driver.find_elements(By.CSS_SELECTOR,"#competencia > div > ul > li > a> label > input")
yearMonth = []
for i in range(len(monthBoxes)):
yearMonth.append(monthBoxes[i].get_attribute("value"))

def getMonthsforYear(year):
year = str(year)
boolMonth = [year in i for i in yearMonth]
return(list(compress(yearMonth,boolMonth)))

def ClickMonthCheckbox(monthsList):
driver.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()
for month in monthsList:
monthIdx = str(yearMonth.index(month) + 1)
monthxpath = '//*[@id="competencia"]/div/ul/li[{}]/a/label/input'.format(monthIdx)
driver.find_element(By.XPATH,monthxpath).click()

def SelectAllMonthsInaYear(year):
TmpMonthsList = getMonthsforYear(year)
ClickMonthCheckbox(TmpMonthsList)
driver.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()

def checkboxIsSelected(monthsList):
driver.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()
for month in monthsList:
monthIdx = str(yearMonth.index(month) + 1)
monthxpath = '//*[@id="competencia"]/div/ul/li[{}]/a/label/input'.format(monthIdx)
checkbox = driver.find_element(By.XPATH,monthxpath)
print(checkbox.is_selected())

def checkboxYearIsSelected(year):
driver.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()
TmpMonthsList = getMonthsforYear(year)
checkboxIsSelected(TmpMonthsList)
driver.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()

def getHTMLtable():
driver.find_element(By.XPATH,'//*[@id="j_idt44"]/div[3]/div[1]/div/div[2]/div[2]/div[5]/div/div/div[1]/label').click() # Click on submit button
driver.find_element(By.XPATH,'//*[@id="tabela_length"]/label/select').send_keys('100') # Set number of rows in table to 100
t = driver.find_element(By.XPATH,'//*[@id="tabela"]').get_attribute('outerHTML') # //*[@id="tabela"]/tbody
table = pd.read_html(t,thousands ='.')
table_dt = pd.concat(table)
#table_dt['sex'] = 'Female'
#table_dt['agelower'] = 5
#table_dt['ageupper'] = 9
return(table_dt)

def SetParametersAndGetTable(agemin,agemax,sex,year, code, codeType):
if sex == 1:
sexL = "Both sexes"
elif sex == 2:
sexL = "Males"
else:
sexL = "Females"

dlCode = code + "." + str(year) + "." + sexL + "." + str(agemin) + "."  + str(agemax)

setAgeLimit(agelower = agemin,ageupper = agemax)
SelectAllMonthsInaYear(year)
setSex(sex = sex)
setDxCode(code = code, codeType = codeType)
time.sleep(1)
try:
table_dt = getHTMLtable()
table_dt['code'] = code
table_dt['sex'] = sexL
table_dt['agelower'] = agemin
table_dt['ageupper'] = agemax
table_dt = table_dt[['code','sex', 'agelower', 'ageupper','Competência','Atendimento Individual']]
table_dt.rename(columns = {'Competência':"YearMonth",'Atendimento Individual':"individual.visits",
'code':'code','sex':"sex",'agelower':"agelower",'ageupper':"ageupper"},inplace= True)
table_dt['YearMonth'] = pd.to_datetime(table_dt['YearMonth'], format = "%Y%m").dt.strftime('%Y-%m')
setDxCode(code = code, codeType = codeType) # Unselect code
time.sleep(1)
setSex(sex = sex) # Unselect Sex
SelectAllMonthsInaYear(year) # Unselect yearMonth parameters
return(table_dt)
except:
print(f'Table not found for {dlCode}')
setDxCode(code = code, codeType = codeType) # Unselect code
time.sleep(1)
setSex(sex = sex) # Unselect Sex
SelectAllMonthsInaYear(year) # Unselect yearMonth parameters

def ApplyRows(row):
year = row['year']
sex = row['sex']
agelower = row['agelower']
ageupper = row['ageupper']
code = row['code']
codeType = row['codeType']

if sex == 1:
sexL = "Both sexes"
elif sex == 2:
sexL = "Males"
else:
sexL = "Females"

anx_dep_key = code + "." + str(year) + "." + str(sex) + "." + str(agelower) + "." + str(ageupper)
print(anx_dep_key)
table_name = "~/sisab/data/anxiety_depression_with_codes/sisab_anx_dep_code_{}_{}_{}_{}_to_{}.xlsx".format(code,str(year),sexL,str(agelower),str(ageupper))
print(table_name)

try:
print("Scraping code {}, year {}, for {} in age range {} to {}".format(code,str(year),sexL,str(agelower),str(ageupper)))

table_dt = SetParametersAndGetTable(agemin = agelower,agemax = ageupper,sex = sex,year = year, code = code, codeType = codeType)
table_dt.to_excel(table_name,index = False,header = True)
Anx_Dep_dict[anx_dep_key] = table_dt
except:
notRun = {'Code':code,'codeType':codeType,'Year':year,'Sex':sex,'agelower':agelower,'ageupper':ageupper}
noRun.append(notRun)
А затем примените функцию ApplyRows() к каждой строке кадра данных комбинаций.

Код: Выделить всё

noRun = []
Anx_Dep_dict = {}
combns.apply(ApplyRows, axis = 1)
Моя проблема в том, что выполнение каждой строки занимает около 20 секунд, а при ~ 17000 строк это означает, что для завершения выполнения всех строк потребуется более 3 дней, если нет проблем.
Я пытаюсь выяснить, есть ли способ распараллелить его с Dask. Я не уверен, нужно ли мне использовать Dask.dataframe, dask.delayed или оба, и как я буду их использовать. Я ищу подсказки о том, как это сделать, и буду признателен за любую помощь.
Большое спасибо!!
Обновление 2024 г. -11-07
Я воспользовался предложением @EuanG и попробовал библиотеку concurrent.futures для распараллеливания кода. Вот мой обновленный код:

Код: Выделить всё

import pandas as pd
import numpy as np
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from itertools import compress
import time
from concurrent.futures import ThreadPoolExecutor, wait

def get_driver(headless):
options = webdriver.ChromeOptions()
if headless:
options.add_argument("--headless=new")
# initialize driver
driver = webdriver.Chrome(executable_path=DRIVER_PATH,options=options)
#driver.get(URL)
return driver

def browserSettings(browser):
base_url = "https://sisab.saude.gov.br/paginas/acessoRestrito/relatorio/federal/saude/RelSauProducao.xhtml"
#time.sleep(3)
browser.get(base_url)
# Set type of service - Individual
browser.find_element(By.ID,"tpProducao").send_keys('Atendimento Individual')

# Set column to month (Competencia)
browser.find_element(By.XPATH,'//*[@id="selectLinha"]/optgroup[1]/option[6]').click()

# Set Type of team
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]/ul/li[2]/a/label/input').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]/ul/li[5]/a/label/input').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]/ul/li[9]/a/label/input').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[1]').click()

# Set place of service
browser.find_element(By.XPATH,'//*[@id="filtrosLocalTipoEstabelecimento"]/div/button').click()
browser.find_element(By.XPATH,'//*[@id="filtrosLocalTipoEstabelecimento"]/div/ul/li[2]/a/label/input').click()
browser.find_element(By.XPATH,'//*[@id="filtrosLocalTipoEstabelecimento"]/div/button').click()

# Set type of service - Individual
browser.find_element(By.ID,"tpProducao").send_keys('Atendimento Individual')

# Set type of attendance - select all
browser.find_element(By.XPATH,'//*[@id="divTipoAtendimento"]/div/button/span').click()
browser.find_element(By.XPATH,'//*[@id="divTipoAtendimento"]/div/ul/li[1]/a/label').click()
browser.find_element(By.XPATH,'//*[@id="divTipoAtendimento"]/div/button/span').click()

# Set type of professional
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/button/span').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/ul/li[12]/a/label').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/ul/li[19]/a/label').click()
browser.find_element(By.XPATH,'//*[@id="filtroEquipeProf"]/div[2]/button/span').click()

# Select 'years' button for age
browser.find_element(By.XPATH,'//*[@id="tpIdade:2"]').click()
И обновленные функции:

Код: Выделить всё

def setDxCode(code, codeType,browser):
if codeType == 'CID':
codeXpath = '//*[@id="cid-{}-1"]'.format(code)
#code = code
else:
codeXpath = '//*[@id="cid-{}-4"]'.format(code)
#codeXpath = '//*[@id="cid-{}"]'.format(code)
#codeXpath = createXpathPattern(code = code, codeType = codeType)
browser.find_element(By.ID,"btnAddCid").click()
time.sleep(1)
searchBox = browser.find_element(By.XPATH,'//*[@id="dtBasicExample_filter"]/label/input')
searchBox.clear()
searchBox.send_keys(code)
#time.sleep(1)
browser.find_element(By.XPATH,codeXpath).click()
searchBox.clear()
#time.sleep(1)
browser.find_element(By.XPATH,'//*[@id="modal-default-cid"]/div/div/div[2]/button[2]/span').click()

# function to set age group and sex
def setAgeLimit(agelower, ageupper,browser):

"""Selects the upper and lower age limit in years,  and the sex for which data is to be output"""

#Set lower age limit
agelim1 = browser.find_element(By.XPATH,'//*[@id="idadeInicio"]')
agelim1.clear()
agelim1.send_keys(str(agelower))

#Set uper age limit
agelim2 = browser.find_element(By.XPATH,'//*[@id="idadeFim"]')
agelim2.clear()
agelim2.send_keys(str(ageupper))

def setSex(browser,sex = 1):
# Set Sex
sexXpath = '//*[@id="filtrosCaracteristicaUsuario"]/div/ul/li[{}]/a/label'.format(sex)
browser.find_element(By.XPATH,'//*[@id="filtrosCaracteristicaUsuario"]/div/button/span').click() #//*[@id="filtrosCaracteristicaUsuario"]/div/button
browser.find_element(By.XPATH,sexXpath).click() # //*[@id="filtrosCaracteristicaUsuario"]/div/ul/li[2]/a/label/input
browser.find_element(By.XPATH,'//*[@id="filtrosCaracteristicaUsuario"]/div/button/span').click()

# Get list of all months in the months column in the webpage
#monthBoxes = driver.find_elements(By.CSS_SELECTOR,"#competencia > div > ul > li > a> label > input")
#yearMonth = []
#for i in range(len(monthBoxes)):
#    yearMonth.append(monthBoxes[i].get_attribute("value"))

def GetYearMonth(browser):
monthBoxes = browser.find_elements(By.CSS_SELECTOR,"#competencia > div > ul > li > a> label > input")
yearMonth = []
for i in range(len(monthBoxes)):
yearMonth.append(monthBoxes[i].get_attribute("value"))
return(yearMonth)

def getMonthsforYear(year,browser):
yearMonth = GetYearMonth(browser = browser)
year = str(year)
boolMonth = [year in i for i in yearMonth]
return(list(compress(yearMonth,boolMonth)))

def ClickMonthCheckbox(monthsList,browser):
yearMonth = GetYearMonth(browser = browser)
browser.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()
for month in monthsList:
monthIdx = str(yearMonth.index(month) + 1)
monthxpath = '//*[@id="competencia"]/div/ul/li[{}]/a/label/input'.format(monthIdx)
browser.find_element(By.XPATH,monthxpath).click()

def SelectAllMonthsInaYear(year,browser):
TmpMonthsList = getMonthsforYear(year, browser = browser)
ClickMonthCheckbox(TmpMonthsList, browser = browser)
browser.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()

def checkboxIsSelected(monthsList,browser):
browser.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()
for month in monthsList:
monthIdx = str(yearMonth.index(month) + 1)
monthxpath = '//*[@id="competencia"]/div/ul/li[{}]/a/label/input'.format(monthIdx)
checkbox = browser.find_element(By.XPATH,monthxpath)
print(checkbox.is_selected())

def checkboxYearIsSelected(year,browser):
browser.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()
TmpMonthsList = getMonthsforYear(year)
checkboxIsSelected(TmpMonthsList)
browser.find_element(By.XPATH,'//*[@id="competencia"]/div/button/span').click()

def getHTMLtable(browser):
browser.find_element(By.XPATH,'//*[@id="j_idt44"]/div[3]/div[1]/div/div[2]/div[2]/div[5]/div/div/div[1]/label').click() # Click on submit button
browser.find_element(By.XPATH,'//*[@id="tabela_length"]/label/select').send_keys('100') # Set number of rows in table to 100
t = browser.find_element(By.XPATH,'//*[@id="tabela"]').get_attribute('outerHTML') # //*[@id="tabela"]/tbody
table = pd.read_html(t,thousands ='.')
table_dt = pd.concat(table)
#table_dt['sex'] = 'Female'
#table_dt['agelower'] = 5
#table_dt['ageupper'] = 9
return(table_dt)

def SetParametersAndGetTable(agemin,agemax,sex,year, code, codeType,browser):
if sex == 1:
sexL = "Both sexes"
elif sex == 2:
sexL = "Males"
else:
sexL = "Females"

dlCode = code + "." + str(year) + "." + sexL + "." + str(agemin) + "."  + str(agemax)

setAgeLimit(agelower = agemin,ageupper = agemax,browser = browser)
SelectAllMonthsInaYear(year,browser = browser)
setSex(sex = sex,browser = browser)
setDxCode(code = code, codeType = codeType,browser = browser)
time.sleep(1)
try:
table_dt = getHTMLtable(browser = browser)
table_dt['code'] = code
table_dt['sex'] = sexL
table_dt['agelower'] = agemin
table_dt['ageupper'] = agemax
table_dt = table_dt[['code','sex', 'agelower', 'ageupper','Competência','Atendimento Individual']]
table_dt.rename(columns = {'Competência':"YearMonth",'Atendimento Individual':"individual.visits",
'code':'code','sex':"sex",'agelower':"agelower",'ageupper':"ageupper"},inplace= True)
table_dt['YearMonth'] = pd.to_datetime(table_dt['YearMonth'], format = "%Y%m").dt.strftime('%Y-%m')
setDxCode(code = code, codeType = codeType,browser = browser) # Unselect code
time.sleep(1)
setSex(sex = sex,browser = browser) # Unselect Sex
SelectAllMonthsInaYear(year,browser = browser) # Unselect yearMonth parameters
return(table_dt)
except:
print(f'Table not found for {dlCode}')
setDxCode(code = code, codeType = codeType,browser = browser) # Unselect code
time.sleep(1)
setSex(sex = sex,browser = browser) # Unselect Sex
SelectAllMonthsInaYear(year,browser = browser) # Unselect yearMonth parameters

def getVarsFromDF(df,rownum):
year = df.loc[rownum,'year']
sex = df.loc[rownum,'sex']
agelower = df.loc[rownum,'agelower']
ageupper = df.loc[rownum,'ageupper']
code = df.loc[rownum,'code']
codeType = df.loc[rownum,'codeType']

if sex == 1:
sexL = "Both sexes"
elif sex == 2:
sexL = "Males"
else:
sexL = "Females"

anx_dep_key = code + "." + str(year) + "." + str(sex) + "." + str(agelower) + "." + str(ageupper)
#print(anx_dep_key)
table_name = "~/sisab/data/anxiety_depression_with_codes/parallel_download/sisab_anx_dep_code_{}_{}_{}_{}_to_{}.xlsx".format(code,str(year),sexL,str(agelower),str(ageupper))
#print(table_name)
return({'year':year,'sex':sex,'sexL':sexL,'ageupper':ageupper,'agelower':agelower,'code':code,'codeType':codeType,'anx_dep_key':anx_dep_key,'table_name':table_name})

def getRowArgs(df,rownum,browser):
year = df.loc[rownum,'year']
sex = df.loc[rownum,'sex']
agelower = df.loc[rownum,'agelower']
ageupper = df.loc[rownum,'ageupper']
code = df.loc[rownum,'code']
codeType = df.loc[rownum,'codeType']

if sex == 1:
sexL = "Both sexes"
elif sex == 2:
sexL = "Males"
else:
sexL = "Females"

anx_dep_key = code + "." + str(year) + "." + str(sex) + "." + str(agelower) + "."  + str(ageupper)
print(anx_dep_key)
table_name = "~/sisab/data/anxiety_depression_with_codes/parallel_download/sisab_anx_dep_code_{}_{}_{}_{}_to_{}.xlsx".format(code,str(year),sexL,str(agelower),str(ageupper))
print(table_name)

try:
print("Scraping code {}, year {}, for {} in age range {} to {}".format(code,str(year),sexL,str(agelower),str(ageupper)))

table_dt = SetParametersAndGetTable(agemin = agelower,agemax = ageupper,sex = sex,year = year, code = code, codeType = codeType,browser = browser)
table_dt.to_excel(table_name,index = False,header = True)
Anx_Dep_dict[anx_dep_key] = table_dt
return(table_dt)
except:
notRun = {'Code':code,'codeType':codeType,'Year':year,'Sex':sex,'agelower':agelower,'ageupper':ageupper}
noRun.append(notRun)

def run_process(headless,df, number):
Browser = get_driver(headless = False)
browserSettings(browser = Browser)
#vars = getVarsFromDF(df = combns, rownum = 365)
#setSex(browser = Browser,sex = vars['sex'])
#test_dt = SetParametersAndGetTable(browser = Browser,agemin = vars['agelower'],agemax = vars['ageupper'],sex = vars['sex'],year = vars['year'], code = vars['code'],
#                         codeType = vars['codeType'])

table_dt = getRowArgs(df = df, rownum = number,browser = Browser)
Browser.close()
return(table_dt)
Наконец, запустите код в несколько потоков:

Код: Выделить всё

noRun = []
Anx_Dep_dict = {}
futures = []

if __name__ == '__main__':
# scrape and crawl
with ThreadPoolExecutor(max_workers = 3) as executor:
for number in range(0,combns.shape[0]):
futures.append(
executor.submit(run_process, headless = True, df = combns, number = number)
)

wait(futures)
Хотя это, кажется, работает хорошо, я столкнулся с проблемой пропуска некоторых строк, по-видимому, случайно. Я не уверен, как исправить или диагностировать эту проблему. Есть рекомендации?
Еще раз спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... nd-updated
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Парсинг веб-страниц / Парсинг веб-страниц Zomato с помощью BeautifulSoup
    Anonymous » » в форуме Python
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Распараллелить парсинг веб-страниц с помощью Python и Selenium
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Распараллелить парсинг веб-страниц с помощью Python и Selenium
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Парсинг веб-страниц с помощью Python с использованием Selenium: невозможно перемещаться между страницами
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Парсинг веб-страниц с помощью Selenium [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»