python - 当 URL 不变时如何在网页抓取时遍历页面
问题描述
我想获取分行和 ATM 的列表(仅)及其地址。
我正在尝试抓取:
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
这为我提供了第一页所需的信息,但我想对所有页面都这样做。有人可以建议吗?
解决方案
尝试以下使用 python 的方法 -请求简单、直接、可靠、快速且在请求方面需要更少的代码。在检查了谷歌浏览器的网络部分后,我从网站本身获取了 API URL。
下面的脚本到底在做什么:
首先,它将获取 API URL,该 URL 是使用标头、有效负载和大写中的动态参数创建的,然后执行 POST 请求。
有效负载是动态的,您可以在参数中传递任何有效值,并且每次您想从站点获取内容时都会为您创建数据。(!重要的是不要更改 Page_No 参数的值)。
获取数据后脚本将使用 json.loads 库解析 JSON 数据。
最后,它将遍历每次迭代或页面中获取的地址列表,例如:地址、姓名、电话号码、传真、城市等,您可以根据需要修改这些属性。
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) + '&query=&dsLocationResult=%7B76EE6530-2A27-46A7-8B32-52E3DAE19DC3%7D&itemId=%7BC59FD793-38C1-444C-9612-1E3A3019BED3%7D' 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()
推荐阅读
- python - 为什么 findall 返回一个空白字符串?
- c# - MS Teams 机器人创建群组对话
- swift - Swift 5.5,何时在自定义异步实现中使用“Task.suspend”?
- python - 如何根据列中的值计算新列?我需要创建字符串链来在 pandas python 中创建我的新列
- php - 在 SQL Server 中使用 VARCHAR 列时 PDO WHERE 出现问题
- java - Mapstruct映射嵌套类问题
- templates - 如何在流体模板中使用常量?
- reactjs - 将数据作为类组件而不是 Hook 获取
- android - 将 ringrtc 构建结果链接到 signal-android 项目
- python - 我需要将嵌套的字典数组转换为 pandas python 中的新数据框