beautifulsoup翻译 beautifulsoup数据解析器

本文旨在解决使用beautif ulsoup进行网页抓取时,遇到动态加载内容导致获取到空字符串或我们揭示了javas crypt和ajax在其中扮演的角色,并提供了一种高效的解决方案:说明:并使用美丽汤因本身进行解析,从而避免页面动态渲染而产生的抓取问题。理解BeautifulSoup与动态加载
在使用Py进行网页抓取时,BeautifulSoup是一个强大且常用的库,它能够帮助我们从HTML或XML文件中提取数据。然而,当BeautifulSoup:“失效”时,常是因为BeautifulSoup解析网页的初始HTML源代码,而那些通过JavaScript在页面加载后加载(AJAX)获取并渲染的内容,并不存在于初始源代码中。
以一个具体的想象我们尝试从一个房地产网站提取“细分”事实”(小区信息)部分的数据,例如“平均挂牌价格”(平均挂牌价格)。
我们可能会编写类似以下的代码:import requestsfrom bs4 import BeautifulSouphouse_url = 'https://www.har.com/homedetail/2701-main-st-1910-houston-tx-77002/15331551'#假设你的请求头已定义your_header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/91.0.4472.124 Safari/537.36'} house_response = requests.get(url=house_url, headers=your_header)house_soup = BeautifulSoup(house_response.text, 'html.parser').find('div', {'class':'pt-2 pb-2 mr-4 pr-md-5 ml-4 pl-md-5'})# # 查找 subdivision_info_div: # 尝试进一步查找并获取文本 target_div = subdivision_info_div.find('div', {'class': 'row'}) if target_div: first_item = target_div.findAll('div', {'class': 'col-md-4 col-6 mb-4'}) if first_item: print(first_item[0]. getText()) else: print(quot;未找到具体数据项quot;) else: print(quot: print(quot;未找到小区信息部分quot;)登录后复制
然而,上述代码的输出很可能是:'\n-----------\n -----------\n'登录后复制这表明我们同时找到了下载视频:“平均”标价:$428,844” listings)”等数据,并不是随最终HTML一起加载,而是通过JavaS漂亮ulSoup p>
要解决这个问题,我们需要改变策略,不再依赖于解析原创HTML。
核心思想是查找网页动态数据加载所依赖的API口,1:识别AP I请求
通常,我们可以通过浏览器的开发者工具(F12)来监控网络请求。在“Network”(网络)选项卡中,重新加载页面,并筛选XHR(XMLHttpRequest)或Fetch/XHR请求。仔细检查这些请求,找到与我们相关数据相关的API调用。
在上述案例中,通过分析网页的网络请求,可以发现一个名为 getSubdivisionFacts 的 API 请求,URL结构如下:
https://www.har.com/api/getSubdivisionFacts/15331551 千面视频动捕
千面视频动捕是一个AI视频动捕方案,致力于将视频中的人体其连接二维信息转化为三维模型动作。 27查看详情
其中15331551好像是房屋的ID。这个API直接返回了我们需要的小区事实数据,并且完成HTML片段的形式返回,对于这来说BeautifulSoup来说是理想的。步骤2:通过API获取数据并解析
一旦识别出API接口,我们就可以使用请求我们可以将这个响应(内容通常是JSON或HTML片段)再次传递给BeautifulSoup进行解析。
以下是实现这一过程的Python代码:import requestsfrom bs4 import BeautifulSoup# 直接访问提供动态数据的API接口api_url = 'https://www.har.com/api/getSubdivisionFacts/15331551'# 发送GET请求获取API数据#对于某些API,可能需要设置headers或paramsreq = requests.get(api_url).text# BeautifulSoup(req) 'lxml')#查找“Average List Price”及其对应的值# #CSS 然后使用.find_next_sibling('div')找到其紧邻的兄弟div,该div包含了我们需要的价格price_label_div = soup.select_one('div[class=quot;col-md-4 col-6 mb-4quot;] gt; div:-soup-contains(quot;Average List Pricequot;)')if价格标签_div: 价格_值_div = Price_label_div.find_next_sibling('div') if Price_value_div:average_list_price = Price_value_div.text print(fquot;平均标价:{average_list_price}quot;) else: print(quot;未找到平均挂牌价格的值quot;)else: print(quot;未找到平均挂牌价格的标签quot;)#也可以提取其他数据,例如“市场区域名称”market_area_label_div = soup.select_one('div[class=quot;col-md-4 col-6 mb-4quot;] gt; div:-soup-contains(quot;市场区域名称quot;)')if market_area_label_div: market_area_value_div = market_area_label_div.find_next_sibling('div') if market_area_value_div: market_area_name = market_area_value_div.text print(fquot;市场区域名称: {market_area_name}quot;)登录后复制
输出:平均标价:$428,844市场区域名称:Midtown - Houston 登录后复制
通过这种方法,我们成功地绕过了前面
API直接调用API虽然高效,但API接口可能随时变更,导致抓图片:密集或过快的API请求可能会被服务器识别为不良行为,导致IP被封禁。遵守网站的robots.txt协议,并设置合理的请求间隔。API响应格式:API返回的数据格式不是HTML,也可能是JSON、XML等。当返回JSON时,应使用Python的json库进行解析,是BeautifulSoup。动态API参数:有些API的URL或请求体中包含动态生成的参数(如计时器、签名等),这会增加注意力。在这种情况下,可能需要更复Soup-包含伪类:在BeautifulSoup 4.7.0Select_one方法支持:soup-contains a class,这使得我们可以根据元素内部的文本内容进行选择,极大地简化了查找过程。
通过理解网页内容的加载机制,并灵活运用请求库直接访问接口API,我们可以有效地在抓取动态加载内容时遇到BeautifulSoup
以上就是BeautifulSoup抓取动态加载内容:解更多请关注乐哥常识网其他相关! 相关标签: css javascript python java html js 前端文章 json ajax windows浏览器 Python JavaScript json ajax html beautifulsoup select xml字符串 伪类 https 自动化 都在看: CSS Hover大家效果在独立SVG元素中有效,但在Card集成中失效的问题 CSS Grid实现图片幻灯片完美居中:告别布局问题rgba
