从页面中排序的站点中截取json内容

时间:2018-03-10 15:59:36

标签: python json web-scraping

我试图废弃一个网站,当我运行以下代码时没有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&region_id=&parent_id=&pagina=&nombre="

resp = requests.get(url, headers={'User-Agent':'Mozilla/5.0'})

data = resp.json()

1 个答案:

答案 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&region_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.