#python #selenium-webdriver #web-scraping #beautifulsoup
#python #selenium-webdriver #веб-очистка #beautifulsoup
Вопрос:
Я хочу получить список филиалов и банкоматов (только) вместе с их адресом.
Я пытаюсь очистить:
url="https://www.ocbcnisp.com/en/hubungi-kami/lokasi-kami"
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui
import WebDriverWait
from selenium.webdriver.support
import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
driver = webdriver.Chrome()
driver.get(URL)
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()
import re
import pandas as pd
Branch_list=[]
Address_list=[]
for i in soup.find_all('div',class_="ocbc-card ocbc-card--location"):
Branch=soup.find_all('p',class_="ocbc-card__title")
Address=soup.find_all('p',class_="ocbc-card__desc")
for j in Branch:
j = re.sub(r'<(.*?)>', '', str(j))
j = j.strip()
Branch_list.append(j)
for k in Address:
k = re.sub(r'<(.*?)>', '', str(k))
k = k.strip()
Address_list.append(k)
OCBC=pd.DataFrame()
OCBC['Branch_Name']=Branch_list
OCBC['Address']=Address_list
Это дает мне необходимую информацию на первой странице, но я хочу сделать это для всех страниц. Может кто-нибудь предложить?
Комментарии:
1. Если вы используете Selenium, просто нажмите кнопку Далее, чтобы очистить данные на следующей странице. Также я не вижу причин использовать регулярные выражения и BeautifulSoup
Ответ №1:
Попробуйте следующий подход с использованием python — запросы простые, понятные, надежные, быстрые и требуют меньше кода, когда дело доходит до запросов. Я извлек URL-адрес API с самого веб-сайта после проверки сетевого раздела браузера Google Chrome.
Что именно делает приведенный ниже скрипт:
-
Сначала он примет URL-адрес API, который создается с использованием заголовков, полезной нагрузки и динамического параметра в caps, а затем выполнит POST-запрос.
-
Полезная нагрузка является динамической, вы можете передать любое допустимое значение в параметрах, и данные будут создаваться для вас каждый раз, когда вы захотите что-то получить с сайта.(!Важно не изменять значение параметра Page_No).
-
После получения данных скрипт проанализирует данные JSON с помощью библиотеки json.loads.
-
Наконец, он будет перебирать весь список адресов, выбранных на каждой итерации или странице, например: — Адрес, имя, номер телефона, факс, город и т. Д., Вы можете изменить эти атрибуты в соответствии с вашими потребностями.
def scrape_atm_data(): PAGE_NO = 1 url = "https://www.ocbcnisp.com/api/sitecore/ContactUs/GetMapsList" #API URL headers = { 'content-type': 'application/x-www-form-urlencoded', 'cookie': 'ocbc#lang=en; ASP.NET_SessionId=xb3nal2u21pyh0rnlujvfo2p; sxa_site=OCBC; ROUTEID=.2; nlbi_1130533=goYxXNJYEBKzKde7Zh 2XAAAAADozEuZQihZvBGZfxa GjRf; visid_incap_1130533=1d1GBKkkQPKgTx 24RCCe6CPql8AAAAAQUIPAAAAAAChaTReUWlHSyevgodnjCRO; incap_ses_1185_1130533=hofQMZCe9WmvOiUTXvdxEKGPql8AAAAAvac5PaS0noMc UXHbHc1DA==; SC_ANALYTICS_GLOBAL_COOKIE=e0aa2fcca70c4d999a32fc1f74d09fc8|True; incap_ses_707_1130533=OcSGOGJw3joFLj7x/8TPCVuWql8AAAAAlY3z7ZcDzd/Kba5s5UgLPQ==', }#header and type !Important to add both headers while True: print('Creating new payload data for page no : ' str(PAGE_NO)) payload = 'currPage=' str(PAGE_NO) 'amp;query=amp;dsLocationResult={76EE6530-2A27-46A7-8B32-52E3DAE19DC3}amp;itemId={C59FD793-38C1-444C-9612-1E3A3019BED3}' response = requests.post(url, data=payload, headers=headers,verify=False) result = json.loads(response.text) #Parse result using JSON loads print('Created new payload now going to fetch data...') if len(result) == 0: break else: extracted_data = result['listItem'] for data in extracted_data: print('-' * 100) print('Fetching data for -> ' , data['name']) print('Name : ', data['name']) print('Address : ', data['alamat']) print('City : ',data['city']) print('fax : ', data['fax']) print('Operating Hours : ',data['operation_hour']) print('Telephone Number : ',data['telp']) print('Location Type : ',data['type_location']) print('-' * 100) PAGE_NO = 1 #increment page number after each iteration to scrape more data scrape_atm_data()
Комментарии:
1. URL api = » ocbcnisp.com/api/sitecore/ContactUs/GetMapsList «выдает ошибку в моем случае. Ошибка сервера в приложении ‘/’. Ресурс не может быть найден. Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, его имя было изменено или временно недоступен. Пожалуйста, просмотрите следующий URL-адрес и убедитесь, что он написан правильно. Запрошенный URL: /api/sitecore/ContactUs/GetMapsList
2. Я могу выполнить тот же код с моей стороны. Добавление скриншота результата
3. Спасибо за ваш ответ. Для меня это выдает ошибку декодирования JSON. Ожидаемое значение: строка 1, столбец 1 (символ 0).
4. No..It выдает мне <Ответ [403]>, когда я пытаюсь посмотреть, как выглядит ответ. Вероятно, поэтому он выдает ошибку декодирования JSON, когда я пытаюсь проанализировать результаты для загрузки JSON. Кроме того, я попытался открыть URL-адрес api в своем браузере, там также не удается найти ресурс.
5. Только сейчас я понял причину, по которой он выдает ошибку 403