首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从按页面排序的站点中抓取json内容

从按页面排序的站点中抓取json内容
EN

Stack Overflow用户
提问于 2018-03-10 15:59:36
回答 1查看 39关注 0票数 0

我试图抓取一个站点,当我在没有region_id=的情况下运行以下代码--从1到32 --我得到一个500,但是如果我设置region_id=1,默认情况下我只会得到第一个页面(在url上是pagina=&),页面最多可达500个;是否有命令或参数来检索每个页面(pagina=的所有可能值),从而避免for循环?

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 18:54:51

即使没有for循环,您仍然需要迭代。您可以像下面所做的那样使用递归或映射来完成它,但是迭代仍然存在。该解决方案的优点是,所有东西都是生成器,所以只有当您从all_data请求页面的json时,才会对url进行格式化,将请求发出、检查并转换为json。我添加了一个过滤器,以确保您在尝试取出json之前得到了一个有效的响应。它仍然按顺序提出每个请求,但是您可以很容易地用并行实现替换map。

代码语言:javascript
运行
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49211097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档