网页数据抓取疑问:脚本仅获69条结果,如何获取全部162条数据?
解决Elasticsearch接口分页获取全量数据的问题
你的脚本仅能获取69条数据,原因是当前请求未指定分页参数,接口默认返回了部分结果。要获取全部162条数据,可通过以下两种方式实现:
方法一:一次性请求全量数据
若接口允许单次返回所有数据,直接在payload中添加size参数,设置为目标总数162即可:
import requests link = 'https://wenomad.so/elasticsearch/search' inner_link = 'https://wenomad.so/city/{}' payload = { "z":"nZ9g0AdFBj7cLRX5v2wSWjjGf2Q5KPpss9DS4wZGh9pvfC4xcJvnTebBg+npAqWaQvdVUFxVD1NZ88siTRUfPo8gB70CGoJG/2MPv9Gu9kC+48KwvV4COpsB3HmER0Mgx0bz2G9pSpw6veTnEUnNR78xonQmhuvL3eztB+ikZaI3OTeuVfRVNetmdX4iDgOkKrM6kLt/2SuRKKwT2aAZHJbdhlTV1I65zj1jD7VBwrm+lJDNh7pZug0/gKCWUDQz4CgmrAdQdnxyJDde2ewzudcsGDimhnWB56bcejoli4LLvevtMB4RUMhmM6FIYn0Tl4sclUD7YLQ8gZQOMmBndDkGctxeq74bpDAwBMOG74qu9gb4WLUFxgB/lWCQ9OnJsfkT0J/kUShhQPoRVr72qUx8f8ldkliIGINoBy9i+lm1RYM3L/NfOJ0kBZ+fbKndVJk2owAZ1kLMupja4iPmpxszQlFGTstpAlF5pTckhL+QYIc6vYbslWqXVs8XrzKs955DHPe1WpWmI714MsJfHhd3XHDsuMy9lfY6mE+cfc0434amFJC5gCgoEhGIQsFQD/kGRaWvqCcMfPYiW/o++nQ017bAKzlg7qb0EfPpy/EMG+u4i7QEU/vvC9mUnVCN0ZzFpxP8HWiTTCF0djuB+UnfUaHKtXciPwwZUTV4o8PtI6v6QdrC4PvtAKSJ9CpIccW+A3SSvOgCgEwOtniCdLxezWaP1Dq3fv9G56HCOvsOGRlQ0RgzNgq/+pCwkvyqFYcs/VtX9NPuaCAAXLi+SFM0xRuI4Sq6nHQr7qs6R2C4gAVHm9bZHfByKZ5x03KJp74IGlGSd1GL9/z9CySVZw==", "y":"oht3SrBVqLvR2lXJSwtwWw==", "x":"dmpOxF/FB13c+GGFmDW4Y4SPz6jEItrcjegm/WNbqFk=", "size": 162 # 指定返回全量数据 } headers = { 'accept': 'application/json, text/javascript, */*; q=0.01', 'accept-language': 'en-US,en;q=0.9', 'origin': 'https://wenomad.so', 'referer': 'https://wenomad.so/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', 'x-requested-with': 'XMLHttpRequest' } res = requests.post(link, json=payload, headers=headers) print(res.status_code) # 确认总数据量 total_hits = res.json()['hits']['total']['value'] print(f"总数据量: {total_hits}") for item in res.json()['hits']['hits']: print(( item['_source']['town_text'], item['_source']['continent__text__text'], item['_source']['country__text__text'], inner_link.format(item['_source']['Slug']) ))
方法二:分页循环请求(更稳妥)
若接口对单次请求的size有限制(比如默认最大100),则需要通过from参数指定起始偏移量,分批次获取数据:
import requests import time link = 'https://wenomad.so/elasticsearch/search' inner_link = 'https://wenomad.so/city/{}' base_payload = { "z":"nZ9g0AdFBj7cLRX5v2wSWjjGf2Q5KPpss9DS4wZGh9pvfC4xcJvnTebBg+npAqWaQvdVUFxVD1NZ88siTRUfPo8gB70CGoJG/2MPv9Gu9kC+48KwvV4COpsB3HmER0Mgx0bz2G9pSpw6veTnEUnNR78xonQmhuvL3eztB+ikZaI3OTeuVfRVNetmdX4iDgOkKrM6kLt/2SuRKKwT2aAZHJbdhlTV1I65zj1jD7VBwrm+lJDNh7pZug0/gKCWUDQz4CgmrAdQdnxyJDde2ewzudcsGDimhnWB56bcejoli4LLvevtMB4RUMhmM6FIYn0Tl4sclUD7YLQ8gZQOMmBndDkGctxeq74bpDAwBMOG74qu9gb4WLUFxgB/lWCQ9OnJsfkT0J/kUShhQPoRVr72qUx8f8ldkliIGINoBy9i+lm1RYM3L/NfOJ0kBZ+fbKndVJk2owAZ1kLMupja4iPmpxszQlFGTstpAlF5pTckhL+QYIc6vYbslWqXVs8XrzKs955DHPe1WpWmI714MsJfHhd3XHDsuMy9lfY6mE+cfc0434amFJC5gCgoEhGIQsFQD/kGRaWvqCcMfPYiW/o++nQ017bAKzlg7qb0EfPpy/EMG+u4i7QEU/vvC9mUnVCN0ZzFpxP8HWiTTCF0djuB+UnfUaHKtXciPwwZUTV4o8PtI6v6QdrC4PvtAKSJ9CpIccW+A3SSvOgCgEwOtniCdLxezWaP1Dq3fv9G56HCOvsOGRlQ0RgzNgq/+pCwkvyqFYcs/VtX9NPuaCAAXLi+SFM0xRuI4Sq6nHQr7qs6R2C4gAVHm9bZHfByKZ5x03KJp74IGlGSd1GL9/z9CySVZw==", "y":"oht3SrBVqLvR2lXJSwtwWw==", "x":"dmpOxF/FB13c+GGFmDW4Y4SPz6jEItrcjegm/WNbqFk=", "size": 69 # 每次请求69条,与当前返回量一致 } headers = { 'accept': 'application/json, text/javascript, */*; q=0.01', 'accept-language': 'en-US,en;q=0.9', 'origin': 'https://wenomad.so', 'referer': 'https://wenomad.so/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', 'x-requested-with': 'XMLHttpRequest' } all_items = [] from_offset = 0 total_hits = None while True: payload = base_payload.copy() payload['from'] = from_offset res = requests.post(link, json=payload, headers=headers) if res.status_code != 200: print(f"请求失败,状态码: {res.status_code}") break response_data = res.json() if total_hits is None: total_hits = response_data['hits']['total']['value'] print(f"总数据量: {total_hits}") hits = response_data['hits']['hits'] if not hits: break all_items.extend(hits) from_offset += len(hits) if len(all_items) >= total_hits: break time.sleep(1) # 添加延迟,避免频繁请求被封禁 # 输出所有数据 for item in all_items: print(( item['_source']['town_text'], item['_source']['continent__text__text'], item['_source']['country__text__text'], inner_link.format(item['_source']['Slug']) )) print(f"共获取到 {len(all_items)} 条数据")
注意事项
- 优先通过接口返回的
hits.total.value确认实际总数据量,避免设置的size值不符合预期。 - 分页请求时建议添加延迟,降低被网站反爬机制封禁的风险。
- 若x、y、z参数为临时生成,可能会过期,需重新从网页请求中获取最新参数。
内容的提问来源于stack exchange,提问作者robots.txt
相关产品推荐
相关产品推荐

