python - 我正在尝试抓取网站,但遇到了问题。当我尝试抓取数据时,看起来 html 与我看到的不同
问题描述
我正在尝试抓取网站,但遇到了问题。当我尝试抓取数据时,看起来 html 与单击检查选项时看到的不同。我正在尝试抓取“https://bri.co.id/en/lokasi”网站以获取银行所有分行的分行名称和地址。
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("C:/Users/manisha.rawat/Downloads/chromedriver.exe")
URL = 'https://bri.co.id/en/lokasi'
driver.get(URL)
soup = BeautifulSoup(driver.page_source, 'html.parser')
driver.quit()
print(soup.find('div',class_="address"))
代码只打印一个地址。我需要所有的地址。谁能建议我做错了什么?
解决方案
尝试以下使用 python 的方法 -请求简单、直接、可靠、快速且在请求方面需要更少的代码。在检查了谷歌浏览器的网络部分后,我从网站本身获取了 API URL。
下面的脚本到底在做什么:
首先,它将获取使用创建的 API URL、查询字符串参数、标题、表单数据及其动态参数(全部大写)并执行 POST 请求。
表单数据是动态的,您可以在参数中传递任何有效值,并且每次您想从站点获取内容时都会为您创建数据。(!重要的是不要更改 Page_No 参数的值)。
获取数据后脚本将使用 json.loads 库解析 JSON 数据。
最后,它将遍历每次迭代或页面中获取的地址列表,例如:地址、名称、代理代码、地图 URL、电话等,您可以根据需要修改这些属性。
def scrape_addresses(): url = "https://bri.co.id/en/lokasi" # API URL querystring = {"p_p_id":"location_display_ortlet","p_p_lifecycle":"2", "p_p_state":"normal","p_p_mode":"view", "p_p_resource_id":"/location/ui/search", "p_p_cacheability":"cacheLevelPage"} # API URL query string parameters !Important to add headers = { 'content-type': "application/x-www-form-urlencoded", 'cache-control': "no-cache" } # headers and type !Important to add #Parameters to create form data (Change as per your need except Page_No parameter) PAGE_NO = 1 LOCATION_TYPE = '' PROVINCE = '' SERVICE = '' while True: print('Creating new form data for page no : ' + str(PAGE_NO)) # Request payload or form-data !Important to add payload = '_location_display_ortlet_page=' + str(PAGE_NO) + '&_location_display_ortlet_locationType=' + LOCATION_TYPE + '&_location_display_ortlet_province=' + PROVINCE + '&_location_display_ortlet_service=' + SERVICE # POST request with provided URL response = requests.post(url, data=payload, headers=headers, params=querystring,verify = False) print('Created new form data going to fetch data...') result = json.loads(response.text) #Parse result using JSON loads if len(result) == 0: break else: extracted_data = result['data'] for data in extracted_data: print('-' * 100) print('Fetching data for : ' , data['name']) print('Address : ', data['address']) print('Agent Code : ',data['agentCode']) print('ID : ', data['id']) print('Latitude : ',data['latitude']) print('Longitude : ',data['longitude']) print('Name : ',data['name']) print('Opening Hours : ',data['openingHours']) print('Phone : ', data['phone']) print('Service Offered : ',data['serviceOffered']) print('Type : ',data['type']) print('Maps URL : ',data['urlMaps']) print('-' * 100) PAGE_NO += 1 #increment page number after each iteration to scrap more data scrape_addresses()
推荐阅读
- delphi - 虚拟树视图将垂直滚动条放在 RightToLeft 双模的右侧
- python - 使用 pyinstaller 打包时缺少模块
- sql - case inside where 子句包含 db2 中的 where 条件
- mdx - Total 和 GrandTotal CUBE 不同
- asp.net - 托管在 azure 上的 webapi 总是收到一个空列表
- azure - 存储队列与服务总线队列 - 轮询/成本问题
- c++ - 奇怪的构造函数行为
- laravel-4 - 从 laravel 控制器输出中仅获取所需列数据的计数
- javascript - 在 javascript 三等号中,首先检查什么?类型或值?
- python - 在 python 中的大型列表操作中具有更高的性能