我试图废弃一个网站,当我运行以下代码时没有region_id=
[从1到32的任何数字]我得到[500],但如果我设置region_id = 1我&# 39;默认情况下只会获得第一页(在网址上为pagina=&
),页面最多为500;是否有一个命令或参数用于检索每个页面(pagina=
的每个可能值),避免循环?
import requests
url = "http://www.enciclovida.mx/explora-por-region/especies-por-grupo?utf8=%E2%9C%93&grupo_id=Plantas®ion_id=&parent_id=&pagina=&nombre="
resp = requests.get(url, headers={'User-Agent':'Mozilla/5.0'})
data = resp.json()
答案 0 :(得分:0)
即使没有for循环,您仍然需要迭代。您可以使用递归或映射来完成,如下所示,但迭代仍然存在。这个解决方案的优点是一切都是生成器,所以只有当你从all_data请求一个页面的json时才会对url进行格式化,所以请求被生成,检查并转换为json。我添加了一个过滤器,以确保在尝试获取json之前得到了有效的响应。它仍然按顺序执行每个请求,但您可以非常轻松地用并行实现替换map。
import requests
from itertools import product, starmap
from functools import partial
def is_valid_resp(resp):
return resp.status_code == requests.codes.ok
def get_json(resp):
return resp.json()
# There's a .format hiding on the end of this really long url,
# with {} in appropriate places
url = "http://www.enciclovida.mx/explora-por-region/especies-por-grupo?utf8=%E2%9C%93&grupo_id=Plantas®ion_id={}&parent_id=&pagina={}&nombre=".format
regions = range(1, 33)
pages = range(1, 501)
urls = starmap(url, product(regions, pages))
moz_get = partial(requests.get, headers={'User-Agent':'Mozilla/5.0'})
responses = map(moz_get, urls)
valid_responses = filter(is_valid_response, responses)
all_data = map(get_json, valid_responses)
# all_data is a generator that will give you each page's json.