使用Selenium修改Facebook Marketplace位置实现多地点爬取
问题描述
需要跨多个指定地点爬取Facebook Marketplace内容,尝试通过Chrome DevTools Protocol覆盖浏览器地理定位的方式修改平台内定位,但是编写的代码没有生效,需要寻找可落地的实现方案。
之前尝试的代码如下:
params = { "latitude": 50.1109, "longitude": 8.6821, "accuracy": 100 } driver = webdriver.Chrome() driver.execute_cdp_cmd("Page.setGeolocationOverride", params) driver.get("https://www.facebook.com/marketplace/")
可落地实现方案
- 优先用Marketplace自带的URL路径指定定位,别全靠地理信号覆盖
现在Facebook Marketplace 并非完全依赖浏览器返回的GPS坐标 判断所在区域,而是通过路径中的城市标识确定展示的商品范围,路径格式为https://www.facebook.com/marketplace/[对应城市路径标识]/。直接访问目标城市对应的路径,比单纯修改CDP地理参数的成功率更高,也不容易触发平台的反爬校验。 - 调整CDP命令的执行时机,提前为站点授予定位权限
原有代码的执行顺序存在逻辑问题:没有提前给Facebook域名授予定位权限就执行定位覆盖,会导致页面发起定位请求时被浏览器拦截,自定义的坐标参数根本无法传递到前端。需要先通过CDP命令为Facebook域名开通永久地理定位权限,再设置定位覆盖参数,最后跳转Marketplace页面。 - 切换爬取地点前,清除前端存储的旧定位缓存
平台会把用户历史选择的Marketplace定位值存储在localStorage和站点cookie中,页面加载时会优先读取缓存里的旧定位值,直接修改地理参数的操作很容易被旧缓存覆盖失效。切换不同爬取地点前,需要清空当前域下的本地存储和历史cookie,再设置新的定位参数。 - 保证多来源定位值的一致性
Marketplace前端会交叉校验三个来源的定位信息:浏览器返回的GPS坐标、URL路径中的城市参数、cookie里存储的定位标识。只要三个来源的定位值不匹配,前端就会自动把定位重置为平台默认的大区域范围,自定义的定位设置就会失效。跨地点爬取时需要把三类参数调整为完全匹配同一个目标区域,才能让定位设置真正生效。
内容的提问来源于stack exchange,提问作者PJ Jenks
相关产品推荐
相关产品推荐

