爬取korter.az网站遇'unmatched '}'错误,求解决方案及指定内容爬取方法
问题解决与爬取方案
一、修复'unmatched '}'错误
你当前依赖固定字符串的正则匹配方式极不稳定,页面内容一旦更新就会失效,还容易捕获到格式错误的JSON片段。更可靠的方式是直接提取页面中存储数据的脚本标签——这类React构建的网站通常会把核心数据放在id="__NEXT_DATA__"的script标签里:
from bs4 import BeautifulSoup as bs import requests import json import pandas as pd url = "https://korter.az/yasayis-kompleksleri-baku" html_doc = requests.get(url).text soup = bs(html_doc, "html.parser") # 定位存储核心数据的script标签 data_script = soup.find("script", id="__NEXT_DATA__").string # 解析JSON格式数据 data_json = json.loads(data_script) # 从JSON结构中提取广告数据(路径需根据实际结构调整,示例为常见路径) ads_data = data_json["props"]["pageProps"]["data"]["ads"] df = pd.DataFrame(ads_data) df.to_excel('korter.xlsx', index=False)
这种方式避免了正则匹配的局限性,数据提取更稳定。如果找不到__NEXT_DATA__标签,也可以搜索包含"ads"或楼盘关键词的script内容。
二、爬取所有'199 yeni tikili binalar'内容
'199 yeni tikili binalar'指新建住宅楼,可通过以下两种方式爬取:
方法1:直接访问分类页
手动点击网站的"新建楼盘"筛选按钮,复制对应的URL(示例URL为https://korter.az/yasayis-kompleksleri-baku?type=yeni-tikili,需以实际页面为准),再用上述JSON提取方法获取数据:
from bs4 import BeautifulSoup as bs import requests import json import pandas as pd # 替换为新建楼盘的实际分类URL url = "https://korter.az/yasayis-kompleksleri-baku?type=yeni-tikili" html_doc = requests.get(url).text soup = bs(html_doc, "html.parser") data_script = soup.find("script", id="__NEXT_DATA__").string data_json = json.loads(data_script) # 提取新建楼盘数据 new_buildings = data_json["props"]["pageProps"]["data"]["ads"] df_new = pd.DataFrame(new_buildings) df_new.to_excel('yeni_tikili_binalar.xlsx', index=False)
方法2:遍历分页爬取全部内容
如果目标内容分布在多页,可根据分页URL规律循环请求:
from bs4 import BeautifulSoup as bs import requests import json import pandas as pd import time base_url = "https://korter.az/yasayis-kompleksleri-baku?type=yeni-tikili&page={}" all_data = [] page = 1 while True: url = base_url.format(page) response = requests.get(url) if response.status_code != 200: break soup = bs(response.text, "html.parser") data_script = soup.find("script", id="__NEXT_DATA__") if not data_script: break data_json = json.loads(data_script.string) ads = data_json["props"]["pageProps"]["data"]["ads"] if not ads: break all_data.extend(ads) page += 1 time.sleep(1) # 添加请求间隔,避免被封禁 df_all = pd.DataFrame(all_data) df_all.to_excel('tum_yeni_tikili_binalar.xlsx', index=False)
注意事项
- 爬取时需遵守网站
robots.txt规则,添加请求间隔避免IP被封禁 - 网站JSON结构可能随版本更新,需定期检查数据提取路径是否正确
内容的提问来源于stack exchange,提问作者Rasim Dilbani
相关产品推荐
相关产品推荐

