我试图抓取一个站点,当我在没有region_id=的情况下运行以下代码--从1到32 --我得到一个500,但是如果我设置region_id=1,默认情况下我只会得到第一个页面(在url上是pagina=&),页面最多可达500个;是否有命令或参数来检索每个页面(pagina=的所有可能值),从而避免for循环?
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()发布于 2018-03-10 18:54:51
即使没有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.https://stackoverflow.com/questions/49211097
复制相似问题