python - script - web scraping tutorial
Lista de Scraping de Python Web desde página web a archivo de texto (2)
Tomé una clase de Python en mi tercer año de universidad, pero he olvidado mucho. Para el trabajo, se me pidió que tratara de encontrar una forma de eliminar alguna fecha de un sitio web. Tengo un archivo de Python que hace algo similar para un sitio diferente que uso. Aquí está ese código:
from bs4 import BeautifulSoup
import io
import requests
soup =
BeautifulSoup(requests.get("https://servicenet.dewalt.com/Parts/Search?searchedNumber=N365763").content)
rows = soup.select("#customerList tbody tr")
with io.open("data.txt", "w", encoding="utf-8") as f:
f.write(u", ".join([row.select_one("td a").text for row in rows]))
Esto obtiene una lista de números de modelo para partes de herramientas eléctricas para ese sitio. Ahora, básicamente, quiero hacer lo mismo, pero no sé por dónde empezar. El sitio es https://www.powertoolreplacementparts.com/briggs-stratton-part-finder/#/s/BRG//498260/1/y
Hace clic en el botón "Dónde se usa" y luego aparece una lista de números de modelo "093412-0011-01", "093412-0011-02", etc. Quiero que esos números se envíen a un archivo de texto separados por comas. al igual que en mi primer código ("093412-0011-01, 093412-0011-02, ...") Cualquier ayuda es muy apreciada. ¡Gracias!
1) Abra Chrome en https://www.powertoolreplacementparts.com/briggs-stratton-part-finder/#/s/BRG//498260/1/y
2) pestaña de red abierta
3) haga clic en "Dónde se usa"
4) Ver llamada API al punto final ''GetModelSearchModelsForPrompt''
5) Copiar url https://partstream.arinet.com/Search/GetModelSearchModelsForPrompt?cb=jsonp1506134982932&arib=BRG&arisku=498260&modelName=&responsive=true&arik=AjydG6MJi4Y9noWP0hFB&aril=en-US&ariv=https%253A%252F%252Fwww.powertoolreplacementparts.com%252Fbriggs-stratton-part-finder%252F
6) Abra eso con las solicitudes, necesitará algunas ideas inteligentes para analizar eso porque están devolviendo HTML en "JSON".
Usé selenio para poder navegar por las páginas.
Código:
import io
import time
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Selenium Intializations
driver = webdriver.Chrome()
driver.get(''https://www.powertoolreplacementparts.com/briggs-stratton-part-finder/#/s/BRG//498260/1/y'')
wait = WebDriverWait(driver, 30)
driver.maximize_window()
# Locating the "Where Used" Button
driver.find_element_by_xpath("//input[@id=''aripartsSearch_whereUsedBtn_0''][@class=''ariPartListWhereUsed ariImageOverride''][@title=''Where Used'']").click()
wait.until(EC.visibility_of_element_located((By.XPATH, ''//*[@id="ari_searchResults_Grid"]/ul'')))
# Intializing BS4 and looking for the "Show More" Button
soup = BeautifulSoup(driver.page_source, "html.parser")
show = soup.find(''li'', {''class'': ''ari-search-showMore''})
# Keep clicking the "Show More" Button until it is not visible anymore
while not show is None:
time.sleep(2)
hidden_element = driver.find_element_by_css_selector(''#ari-showMore-unhide'')
if hidden_element.is_displayed():
print("Element found")
driver.find_element_by_css_selector(''#ari-showMore-unhide'').click()
show = soup.find(''li'', {''class'': ''ari-search-showMore''})
else:
print("Element not found")
break
# Write the data parsed to the text file "data.txt"
with io.open("data.txt", "w", encoding="utf-8") as f:
rows = soup.findAll(''li'', {''class'': ''ari-ModelByPrompt''})
for row in rows:
part = str(row.text).replace(" ", "").replace("/n", "")
print(part)
f.write(part + ",")
Salida:
Element found
Element found
Element found
Element not found
093412-0011-01
093412-0011-02
093412-0015-01
093412-0039-01
093412-0060-01
093412-0136-01
093412-0136-02
093412-0139-01
093412-0150-01
093412-0153-01
093412-0154-01
093412-0169-01
093412-0169-02
093412-0172-01
093412-0174-01
093412-0315-A1
093412-0339-A1
093412-0360-A1
093412-0636-A1
093412-0669-A1
093412-1015-E1
093412-1039-E1
093412-1060-E1
093412-1236-E1
093412-1236-E2
093412-1253-E1
093412-1254-E1
093412-1269-E1
093412-1274-E1
093412-1278-E1
093432-0035-01
093432-0035-02
093432-0035-03
093432-0036-01
093432-0036-03
093432-0036-04
093432-0037-01
093432-0038-01
093432-0038-03
093432-0041-01
093432-0140-01
093432-0145-01
093432-0149-01
093432-0152-01
093432-0157-01
093432-0158-01
093432-0160-01
093432-0192-B1
093432-0335-A1
093432-0336-A1
093432-0337-A1
093432-0338-A1
093432-1035-B1
093432-1035-E1
093432-1035-E2
093432-1035-E4
093432-1036-B1
093432-1036-E1
093432-1037-E1
093432-1038-B1
093432-1038-E1
093432-1240-B1
093432-1240-E1
093432-1257-E1
093432-1258-E1
093432-1280-B1
093432-1280-E1
093432-1281-B1
093432-1281-E1
093432-1282-B1
093432-1282-E1
093432-1286-B1
093452-0049-01
093452-0141-01
093452-0168-01
093452-0349-A1
093452-1049-B1
093452-1049-E1
093452-1049-E5
093452-1241-E1
093452-1242-E1
093452-1277-E1
093452-1283-B1
093452-1283-E1
09A412-0267-E1
09A413-0201-E1
09A413-0202-E1
09A413-0202-E2
09A413-0202-E3
09A413-0203-E1
09A413-0522-E1
09K432-0022-01
09K432-0023-01
09K432-0024-01
09K432-0115-01
09K432-0116-01
09K432-0116-02
09K432-0117-01
09K432-0118-01
120502-0015-E1
Contenido del archivo:
093412-0011-01,093412-0011-02,093412-0015-01,093412-0039-01,093412-0060-01,093412-0136-01,093412-0136-02,093412-0139-01,093412-0150-01,093412-0153-01,093412-0154-01,093412-0169-01,093412-0169-02,093412-0172-01,093412-0174-01,093412-0315-A1,093412-0339-A1,093412-0360-A1,093412-0636-A1,093412-0669-A1,093412-1015-E1,093412-1039-E1,093412-1060-E1,093412-1236-E1,093412-1236-E2,093412-1253-E1,093412-1254-E1,093412-1269-E1,093412-1274-E1,093412-1278-E1,093432-0035-01,093432-0035-02,093432-0035-03,093432-0036-01,093432-0036-03,093432-0036-04,093432-0037-01,093432-0038-01,093432-0038-03,093432-0041-01,093432-0140-01,093432-0145-01,093432-0149-01,093432-0152-01,093432-0157-01,093432-0158-01,093432-0160-01,093432-0192-B1,093432-0335-A1,093432-0336-A1,093432-0337-A1,093432-0338-A1,093432-1035-B1,093432-1035-E1,093432-1035-E2,093432-1035-E4,093432-1036-B1,093432-1036-E1,093432-1037-E1,093432-1038-B1,093432-1038-E1,093432-1240-B1,093432-1240-E1,093432-1257-E1,093432-1258-E1,093432-1280-B1,093432-1280-E1,093432-1281-B1,093432-1281-E1,093432-1282-B1,093432-1282-E1,093432-1286-B1,093452-0049-01,093452-0141-01,093452-0168-01,093452-0349-A1,093452-1049-B1,093452-1049-E1,093452-1049-E5,093452-1241-E1,093452-1242-E1,093452-1277-E1,093452-1283-B1,093452-1283-E1,09A412-0267-E1,09A413-0201-E1,09A413-0202-E1,09A413-0202-E2,09A413-0202-E3,09A413-0203-E1,09A413-0522-E1,09K432-0022-01,09K432-0023-01,09K432-0024-01,09K432-0115-01,09K432-0116-01,09K432-0116-02,09K432-0117-01,09K432-0118-01,120502-0015-E1,